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机的情况。
im4java
主页:http://im4java.sourceforge.net/
下载地址:http://sourceforge.net/projects/im4java/files/
API:http://im4java.sourceforge.net/api/
用那个不用说吧,看更新时间,不知道你们会选择什么
所以我选用了 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 |
} |