-
-
- 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下快。