使用ImageMagick和JMagick对上传图片进行缩放和裁切处理时,经常引起tomcat崩溃,可采用下述方案解决。
对原图片首先按短边压缩至要求的像素数,然后再对处理结果进行取中裁切。
public class ImageUtil {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static boolean zoom(String src, String dst, int pixel) {
int width=0, height=0, x=0, y=0;
ImageIcon icon = new ImageIcon(src);
width = icon.getImage().getWidth(null);
height = icon.getImage().getHeight(null);
if (width > height) {
width = pixel * width / height;
height = pixel;
x = (width - height) / 2;
y = 0;
} else {
height = pixel * height / width;
width = pixel;
x = 0;
y = (height - width) / 2;
}
ArrayList command = new ArrayList(10);
command.add("C:/Program Files/ImageMagick-6.7.2-Q16/convert");
command.add(src);
command.add("-resize");
command.add(width + "x" + height);
command.add(dst);
System.out.println(command);
if(exec((String[]) command.toArray(new String[1]))){
command = new ArrayList(10);
command.add("C:/Program Files/ImageMagick-6.7.2-Q16/convert");
command.add(dst);
command.add("-crop");
command.add(pixel + "x" + pixel + "+" + x + "+" + y);
command.add(dst);
System.out.println(command);
return exec((String[]) command.toArray(new String[1]));
}
return false;
}
private static boolean exec(String[] command) {
Process proc;
try {
proc = Runtime.getRuntime().exec(command);
} catch (IOException e) {
System.out.println("IOException while trying to execute " + command);
return false;
}
int exitStatus;
while (true) {
try {
exitStatus = proc.waitFor();
break;
} catch (java.lang.InterruptedException e) {
System.out.println("Interrupted: Ignoring and waiting");
}
}
if (exitStatus != 0) {
System.out.println("Error executing command: " + exitStatus);
}
return (exitStatus == 0);
}
}