Java 图片压缩-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

Java 图片压缩

简介: 先上传压缩后的效果图一张: 图片1是压缩前,2是压缩后,这是以最大压缩比压缩的,效果只有自己去看了。 package zhangao.main; import java.

先上传压缩后的效果图一张:


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



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章