先上传压缩后的效果图一张:
图片1是压缩前,2是压缩后,这是以最大压缩比压缩的,效果只有自己去看了。
package zhangao.main; import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Locale; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import javax.imageio.stream.ImageOutputStream; //这个类重写了setCompressionQuality方法,因为在压缩JPEG图片的时候可能会出现问题 class MyImageWriteParam extends JPEGImageWriteParam { public MyImageWriteParam() { super(Locale.getDefault()); } public void setCompressionQuality(float quality) { if (quality < 0.0F || quality > 1.0F) { throw new IllegalArgumentException("Quality out-of-bounds!"); } this.compressionQuality = 256 - (quality * 256); } } public class Main { public void compressJpegFile(File infile, File outfile, float compressionQuality) { try { // 检索要压缩的图片 RenderedImage rendImage = ImageIO.read(infile); // 找到一个jpeg writer ImageWriter writer = null; Iterator iter = ImageIO.getImageWritersByFormatName("jpg"); if (iter.hasNext()) { writer = (ImageWriter) iter.next(); } // 准备输出文件 ImageOutputStream ios = ImageIO.createImageOutputStream(outfile); writer.setOutput(ios); // 设置压缩比 ImageWriteParam iwparam = new MyImageWriteParam(); iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); iwparam.setCompressionQuality(compressionQuality); // 写图片 writer.write(null, new IIOImage(rendImage, null, null), iwparam); // 最后清理 ios.flush(); writer.dispose(); ios.close(); } catch (IOException e) { } } public static void main(String[] args) { String initSrc = "c:\\1.jpg"; String dest = "c:\\2.jpg"; new Main().compressJpegFile(new File(initSrc), new File(dest), 1); } }
但是出现了异常(在windows下不会),我的环境是JDK1.4+TOMCAT5.5,系统是AIX5.3,都是很旧的版本,但是没办法,出现的异常如下:
Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
NoClassDefFoundError: sun/awt/X11GraphicsEnvironment.
解决方式:
修改CATALINA.SH文件,我把原JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=GBK"改为JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=GBK;-Djava.awt.headless=true"即可解决这个问题,我甚至还在程序中加入了System.setProperty("java.awt.headless", "true");,但是不知道为什么压缩速度没windows下快。