瀏覽代碼

图片裁剪

huangct 8 年之前
父節點
當前提交
70e414f078

+ 7 - 12
jpress-commons/src/main/java/io/jpress/utils/ImageUtils.java

@@ -15,11 +15,13 @@
  */
 package io.jpress.utils;
 
-import java.awt.AlphaComposite;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.Rectangle;
+import com.jfinal.log.Log;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReadParam;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.FileInputStream;
@@ -27,13 +29,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Iterator;
 
-import javax.imageio.ImageIO;
-import javax.imageio.ImageReadParam;
-import javax.imageio.ImageReader;
-import javax.imageio.stream.ImageInputStream;
-
-import com.jfinal.log.Log;
-
 public class ImageUtils {
 	private static final Log log = Log.getLog(ImageUtils.class);
 

+ 195 - 0
jpress-commons/src/main/java/io/jpress/utils/OperateImage.java

@@ -0,0 +1,195 @@
+package io.jpress.utils;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReadParam;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+import javax.imageio.stream.ImageOutputStream;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.URL;
+import java.util.Iterator;
+
+/**
+ * Created by 黄诚天 on 2017-09-13.
+ */
+public class OperateImage {
+    // ===源图片路径名称如:c:\1.jpg
+    private String srcpath;
+
+    // ===剪切图片存放路径名称.如:c:\2.jpg
+    private String subpath;
+
+    //源图片数据
+    private BufferedImage sourceImg;
+
+    // ===剪切点x坐标
+    private int x;
+    private int y;
+
+    // ===剪切点宽度
+    private int width;
+    private int height;
+
+    public OperateImage() {
+    }
+
+    public OperateImage(int x, int y, int width, int height) {
+        this.x = x;
+        this.y = y;
+        this.width = width;
+        this.height = height;
+    }
+
+    /**
+     * 对图片裁剪,并把裁剪完蛋新图片保存 。
+     */
+    public File cut(String type) throws IOException {
+        FileInputStream is = null;
+        InputStream inputStream = null;
+        ImageInputStream iis = null;
+
+        try {
+            // 读取图片文件
+            //is = new FileInputStream(srcpath);
+
+            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+            ImageOutputStream imageOutput = ImageIO.createImageOutputStream(byteArrayOutputStream);
+            ImageIO.write(this.sourceImg, type, imageOutput);
+            inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
+
+            /*
+             * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader
+             * 声称能够解码指定格式。 参数:formatName - 包含非正式格式名称 .
+             *(例如 "jpeg" 或 "tiff")等 。
+            */
+            Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName(
+                    type);
+            ImageReader reader = it.next();
+            // 获取图片流
+            iis = ImageIO.createImageInputStream(inputStream);
+
+            /*
+             * <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
+             * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader
+             *  避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
+            */
+            reader.setInput(iis, true);
+
+            /*
+             * <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
+             * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件
+             * 将从其 ImageReader 实现的 getDefaultReadParam 方法中返回
+             * ImageReadParam 的实例。
+            */
+            ImageReadParam param = reader.getDefaultReadParam();
+
+            /*
+             * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
+             * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
+            */
+            Rectangle rect = new Rectangle(x, y, width, height);
+
+            // 提供一个 BufferedImage,将其用作解码像素数据的目标。
+            param.setSourceRegion(rect);
+
+            /*
+             * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将
+             * 它作为一个完整的 BufferedImage 返回。
+              */
+            BufferedImage bi = reader.read(0, param);
+
+            // 保存新图片
+            ImageIO.write(bi, type, new File(subpath));
+            File cutImage = new File(subpath);
+
+            return cutImage;
+        } finally {
+            if (is != null) {
+                is.close();
+            }
+
+            if (inputStream != null) {
+                inputStream.close();
+            }
+
+            if (iis != null) {
+                iis.close();
+            }
+        }
+    }
+
+    public static BufferedImage getIconInfo(String iconUrl) {
+        BufferedImage sourceImg = null;
+        try {
+            InputStream murl = new URL(iconUrl).openStream();
+            sourceImg = ImageIO.read(murl);
+            System.out.println(sourceImg.getWidth()); // 源图宽度
+            System.out.println(sourceImg.getHeight()); // 源图高度
+            System.out.println(sourceImg.getWidth() * sourceImg.getHeight());
+            System.out.println(sourceImg.getData());
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+
+        return sourceImg;
+    }
+
+    public int getHeight() {
+        return height;
+    }
+
+    public void setHeight(int height) {
+        this.height = height;
+    }
+
+    public String getSrcpath() {
+        return srcpath;
+    }
+
+    public void setSrcpath(String srcpath) {
+        this.srcpath = srcpath;
+    }
+
+    public String getSubpath() {
+        return subpath;
+    }
+
+    public BufferedImage getSourceImg() {
+        return sourceImg;
+    }
+
+    public void setSourceImg(BufferedImage sourceImg) {
+        this.sourceImg = sourceImg;
+    }
+
+    public void setSubpath(String subpath) {
+        this.subpath = subpath;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+
+    public int getX() {
+        return x;
+    }
+
+    public void setX(int x) {
+        this.x = x;
+    }
+
+    public int getY() {
+        return y;
+    }
+
+    public void setY(int y) {
+        this.y = y;
+    }
+}

+ 52 - 7
jpress-web-admin/src/main/java/io/jpress/admin/controller/_AttachmentController.java

@@ -15,19 +15,12 @@
  */
 package io.jpress.admin.controller;
 
-import java.io.File;
-import java.io.IOException;
-import java.math.BigInteger;
-import java.util.Date;
-import java.util.List;
-
 import com.alibaba.fastjson.JSONObject;
 import com.jfinal.aop.Before;
 import com.jfinal.kit.PathKit;
 import com.jfinal.log.Log;
 import com.jfinal.plugin.activerecord.Page;
 import com.jfinal.upload.UploadFile;
-
 import io.jpress.core.JBaseCRUDController;
 import io.jpress.core.interceptor.ActionCacheClearInterceptor;
 import io.jpress.model.Attachment;
@@ -42,6 +35,14 @@ import io.jpress.template.Thumbnail;
 import io.jpress.utils.AttachmentUtils;
 import io.jpress.utils.FileUtils;
 import io.jpress.utils.ImageUtils;
+import io.jpress.utils.OperateImage;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.util.Date;
+import java.util.List;
 
 @RouterMapping(url = "/admin/attachment", viewPath = "/WEB-INF/admin/attachment")
 @Before(ActionCacheClearInterceptor.class)
@@ -116,6 +117,7 @@ public class _AttachmentController extends JBaseCRUDController<Attachment> {
 			String newPath = AttachmentUtils.moveFile(uploadFile);
 			User user = getLoginedUser();
 
+
 			Attachment attachment = new Attachment();
 			attachment.setUserId(user.getId());
 			attachment.setCreated(new Date());
@@ -136,6 +138,49 @@ public class _AttachmentController extends JBaseCRUDController<Attachment> {
 		}
 	}
 
+	public void doUploadCutImage() {
+		String webRoot = PathKit.getWebRootPath();
+		String requestUrlMessage = this.getRequest().getScheme() +"://" + this.getRequest().getServerName() + ":" + this.getRequest().getServerPort();
+		Attachment attachment = AttachmentQuery.me().findById(getParaToBigInteger("sourceId"));
+		int x1 = getParaToInt("x1");
+		int x2 = getParaToInt("x2");
+		int y1 = getParaToInt("y1");
+		int y2 = getParaToInt("y2");
+		int width = x2 - x1;
+		int height = y2 - y1;
+		String srcpath = requestUrlMessage + "/jpress" + attachment.getPath();
+		String type = attachment.getSuffix().substring(1);
+		//新截取的图片名称在原图名称上加上时间戳
+		long time = System.currentTimeMillis();
+		String title = attachment.getTitle().split("\\.")[0] + time + attachment.getSuffix();
+		String subpath = requestUrlMessage + "/jpress" + "/attachment/" + time + attachment.getSuffix();
+		/*srcpath.replaceAll("/","-");*/
+		BufferedImage bufferedImage = OperateImage.getIconInfo(srcpath);
+		OperateImage o = new OperateImage(x1, y1, width, height);
+		//o.setSrcpath(srcpath);
+		o.setSourceImg(bufferedImage);
+		o.setSubpath("D:\\pictest\\" + time + attachment.getSuffix() );
+		try {
+			File cutImage = o.cut(type);
+			/*Attachment cutImage = new Attachment();
+			attachment.setUserId(attachment.getUserId());
+			attachment.setCreated(new Date());
+			attachment.setTitle(title);
+			attachment.setPath("/attachment/" + time + attachment.getSuffix());
+			attachment.setSuffix(attachment.getSuffix());
+			attachment.setMimeType(attachment.getMimeType());
+			cutImage.save();*/
+
+			JSONObject json = new JSONObject();
+			json.put("success", true);
+			json.put("src", getRequest().getContextPath() + attachment.getPath());
+			renderJson(json.toString());
+		} catch (IOException e) {
+			e.printStackTrace();
+			renderJson("success", false);
+		}
+	}
+
 	private void processImage(String newPath) {
 		if (!AttachmentUtils.isImage(newPath))
 			return;

+ 24 - 9
jpress-web-admin/src/main/webapp/WEB-INF/admin/attachment/choose_layer.html

@@ -27,6 +27,15 @@ $(document).ready(function(){
   });
 
     $('.jp-grids-photos').imgAreaSelect({ maxWidth: 200, maxHeight: 170, handles: true });
+
+    $('.jp-grids-photos').imgAreaSelect({
+        onSelectEnd: function (img, selection) {
+            $('input[name="x1"]').val(selection.x1);
+            $('input[name="y1"]').val(selection.y1);
+            $('input[name="x2"]').val(selection.x2);
+            $('input[name="y2"]').val(selection.y2);
+        }
+    });
 });
 
 $('#fine-uploader-gallery').fineUploader({
@@ -46,6 +55,12 @@ $('#fine-uploader-gallery').fineUploader({
                 }
              }
        });
+
+function doUpload(sourceId) {
+    $('#sourceId').attr("value",sourceId);
+    $(".imageForm").submit();
+}
+
 </#macro> 
 <#macro script_import>
 <script src="${CPATH}/static/plugins/fine-uploader/jquery.fine-uploader.js"></script>
@@ -99,12 +114,12 @@ $('#fine-uploader-gallery').fineUploader({
 				</div>
 				<div class="tab-pane active" id="tab_2">
 					<div class="jp-borwer">
-                        <form action="${CPATH}/admin/attachment/doUpload" method="post">
-                            <input type="hidden" name="x1" value="" />
-                            <input type="hidden" name="y1" value="" />
-                            <input type="hidden" name="x2" value="" />
-                            <input type="hidden" name="y2" value="" />
-                            <input type="hidden" name="sourceId" value="" />
+                        <form id="imageForm" action="${CPATH}/admin/attachment/doUploadCutImage" method="post">
+                            <input id="x1" type="hidden" name="x1" value=""/>
+                            <input id="y1" type="hidden" name="y1" value=""/>
+                            <input id="x2" type="hidden" name="x2" value=""/>
+                            <input id="y2" type="hidden" name="y2" value=""/>
+                            <input type="hidden" id="sourceId" name="sourceId" value="" />
                             <!--<input type="submit" name="submit" value="截取" />-->
 
 							<ul class="list-inline list-unstyled list-items">
@@ -112,14 +127,14 @@ $('#fine-uploader-gallery').fineUploader({
 								<#list page.getList() as bean>
 								<li>
 									<#if bean.isImage() >
-										<img src="${CPATH}${bean.path!}" title="${bean.title!}" path="${CPATH}${bean.path!}" class="jp-grids-photos img-responsive" >
+										<img src="${CPATH}${bean.path!}" title="${bean.title!}" path="${CPATH}${bean.path!}" class="jp-grids-photos img-responsive" id="photoId${bean.id}">
 									<#else>
-										<img src="${CPATH}/static/jpress/admin/image/nothumbnail.jpg" title="${bean.title!}" path="${CPATH}${bean.path!}" class="jp-grids-photos img-responsive">
+										<img src="${CPATH}/static/jpress/admin/image/nothumbnail.jpg" title="${bean.title!}" path="${CPATH}${bean.path!}" class="jp-grids-photos img-responsive" id="photoId${bean.id}">
 									</#if>
 									<div class="brower-active-icon" style="display: none">
 										<i class="fa fa-check-square-o fa-2x" aria-hidden="true"></i>
 									</div>
-                                    <button>确定</button>
+                                    <button onclick="doUpload(${bean.id})">确定</button>
 								</li>
 								</#list>
 								</#if>