java 大图片处理GraphicsMagick + im4java [缩放,旋转,裁剪]

java 大图片处理GraphicsMagick + im4java [缩放,旋转,裁剪]

ImageMagick

主页:http://www.imagemagick.org/script/index.php

GraphicsMagick

主页:http://www.graphicsmagick.org/

两个图片处理软件我就不说了,因为我没那个评论的本事,其实这些软件都会有命令行的指令,然后我们用java调用来对图片进行编辑,调用什么指令可能学一下才知道,不过我们也不用自己写指令吧,因为别人已经封装好了那些指令的接口(JNI),下面就是那些JNI

jmagick

主页:http://www.jmagick.org/index.html

下载地址:http://downloads.jmagick.org/

缺点:实地测试后发现,速度果然提高了不少,但是质量却大大下降了,在大量测试数据下,每生成100张图片约会有5张图片生成出现错误,还会出现down机的情况。 
java 大图片处理GraphicsMagick + im4java [缩放,旋转,裁剪]_第1张图片

im4java

主页:http://im4java.sourceforge.net/

下载地址:http://sourceforge.net/projects/im4java/files/

API:http://im4java.sourceforge.net/api/

java 大图片处理GraphicsMagick + im4java [缩放,旋转,裁剪]_第2张图片

用那个不用说吧,看更新时间,不知道你们会选择什么

所以我选用了 GraphicsMagick +im4java

下载GraphicsMagick 
http://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/1.3.17/ 
其实他就是一个软件,然后windows版本会自动将安装目录加入到path变量,所以在指令窗口可以调用,即安装好就不管它了

下载im4java来方便我们在java调用 
http://sourceforge.net/projects/im4java/files/

然后将里面的im4java-1.3.2加入到我们的项目引用里面就可以了 

根据别人的代码,自己再封装了一下接口吧,基本够用,那些水印的就没加上去了,现在不需要 
工具很强大,都是靠指令,所以多看看API和软件本身的使用吧

好吧,我忽悠完了,把时间交给你们了. 
附上代码:[好纠结的代码编辑器,只能这样了]

1 package test;

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.ArrayList;

import org.im4java.core.ConvertCmd; 
import org.im4java.core.IM4JavaException; 
import org.im4java.core.IMOperation; 
import org.im4java.core.IdentifyCmd; 
import org.im4java.process.ArrayListOutputConsumer;

public class TestGm {

001 /**
002  * * 获得图片文件大小[小技巧来获得图片大小] * * @param filePath * 文件路径 *
003  *
004  * @return 文件大小
005  */
006  
007 public int getSize(String imagePath) {
008     int size = 0;
009     FileInputStream inputStream = null;
010     try {
011         inputStream = new FileInputStream(imagePath);
012         size = inputStream.available();
013         inputStream.close();
014         inputStream = null;
015     catch (FileNotFoundException e) {
016         size = 0;
017         System.out.println("文件未找到!");
018     catch (IOException e) {
019         size = 0;
020         System.out.println("读取文件大小错误!");
021     finally {
022         // 可能异常为关闭输入流,所以需要关闭输入流
023         if (null != inputStream) {
024             try {
025                 inputStream.close();
026             catch (IOException e) {
027                 System.out.println("关闭文件读入流异常");
028             }
029             inputStream = null;
030  
031         }
032     }
033     return size;
034 }
035  
036 /**
037  * 获得图片的宽度
038  *
039  * @param filePath
040  *            文件路径
041  * @return 图片宽度
042  */
043 public int getWidth(String imagePath) {
044     int line = 0;
045     try {
046         IMOperation op = new IMOperation();
047         op.format("%w"); // 设置获取宽度参数
048         op.addImage(1);
049         IdentifyCmd identifyCmd = new IdentifyCmd(true);
050         ArrayListOutputConsumer output = new ArrayListOutputConsumer();
051         identifyCmd.setOutputConsumer(output);
052         identifyCmd.run(op, imagePath);
053         ArrayList<String> cmdOutput = output.getOutput();
054         assert cmdOutput.size() == 1;
055         line = Integer.parseInt(cmdOutput.get(0));
056     catch (Exception e) {
057         line = 0;
058         System.out.println("运行指令出错!");
059     }
060     return line;
061 }
062  
063 /**
064  * 获得图片的高度
065  *
066  * @param imagePath
067  *            文件路径
068  * @return 图片高度
069  */
070 public int getHeight(String imagePath) {
071     int line = 0;
072     try {
073         IMOperation op = new IMOperation();
074  
075         op.format("%h"); // 设置获取高度参数
076         op.addImage(1);
077         IdentifyCmd identifyCmd = new IdentifyCmd(true);
078         ArrayListOutputConsumer output = new ArrayListOutputConsumer();
079         identifyCmd.setOutputConsumer(output);
080         identifyCmd.run(op, imagePath);
081         ArrayList<String> cmdOutput = output.getOutput();
082         assert cmdOutput.size() == 1;
083         line = Integer.parseInt(cmdOutput.get(0));
084     catch (Exception e) {
085         line = 0;
086         System.out.println("运行指令出错!"+e.toString());
087     }
088     return line;
089 }
090  
091 /**
092  * 图片信息
093  *
094  * @param imagePath
095  * @return
096  */
097 public static String getImageInfo(String imagePath) {
098     String line = null;
099     try {
100         IMOperation op = new IMOperation();
101         op.format("width:%w,height:%h,path:%d%f,size:%b%[EXIF:DateTimeOriginal]");
102         op.addImage(1);
103         IdentifyCmd identifyCmd = new IdentifyCmd(true);
104         ArrayListOutputConsumer output = new ArrayListOutputConsumer();
105         identifyCmd.setOutputConsumer(output);
106         identifyCmd.run(op, imagePath);
107         ArrayList<String> cmdOutput = output.getOutput();
108         assert cmdOutput.size() == 1;
109         line = cmdOutput.get(0);
110  
111     catch (Exception e) {
112         e.printStackTrace();
113     }
114     return line;
115 }
116  
117 /**
118  * 裁剪图片
119  *
120  * @param imagePath
121  *            源图片路径
122  * @param newPath
123  *            处理后图片路径
124  * @param x
125  *            起始X坐标
126  * @param y
127  *            起始Y坐标
128  * @param width
129  *            裁剪宽度
130  * @param height
131  *            裁剪高度
132  * @return 返回true说明裁剪成功,否则失败
133  */
134 public boolean cutImage(String imagePath, String newPath, int x, int y,
135         int width, int height) {
136     boolean flag = false;
137     try {
138         IMOperation op = new IMOperation();
139         op.addImage(imagePath);
140         /** width:裁剪的宽度 * height:裁剪的高度 * x:裁剪的横坐标 * y:裁剪纵坐标 */
141         op.crop(width, height, x, y);
142         op.addImage(newPath);
143         ConvertCmd convert = new ConvertCmd(true);
144         convert.run(op);
145         flag = true;
146     catch (IOException e) {
147         System.out.println("文件读取错误!");
148         flag = false;
149     catch (InterruptedException e) {
150         flag = false;
151     catch (IM4JavaException e) {
152         flag = false;
153     finally {
154  
155     }
156     return flag;
157 }
158  
159 /**
160  * 根据尺寸缩放图片[等比例缩放:参数height为null,按宽度缩放比例缩放;参数width为null,按高度缩放比例缩放]
161  *
162  * @param imagePath
163  *            源图片路径
164  * @param newPath
165  *            处理后图片路径
166  * @param width
167  *            缩放后的图片宽度
168  * @param height
169  *            缩放后的图片高度
170  * @return 返回true说明缩放成功,否则失败
171  */
172 public boolean zoomImage(String imagePath, String newPath, Integer width,
173         Integer height) {
174  
175     boolean flag = false;
176     try {
177         IMOperation op = new IMOperation();
178         op.addImage(imagePath);
179         if (width == null) {// 根据高度缩放图片
180             op.resize(null, height);
181         else if (height == null) {// 根据宽度缩放图片
182             op.resize(width);
183         else {
184             op.resize(width, height);
185         }
186         op.addImage(newPath);
187         ConvertCmd convert = new ConvertCmd(true);
188         convert.run(op);
189         flag = true;
190     

你可能感兴趣的:(java 大图片处理GraphicsMagick + im4java [缩放,旋转,裁剪])