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

时间: 2024-09-21 23:11:02

Java 图片压缩的相关文章

Java 图片压缩实现思路及代码

本文为大家详细介绍下图片压缩的具体实现思路及java代码,想学习的各位可以参考下哈,希望对大家有所帮助   Java图片压缩代码 复制代码 代码如下: package com.img; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.im

Java 图片压缩实现思路及代码_java

Java图片压缩代码 复制代码 代码如下: package com.img; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import com.sun.image.codec.jpeg.JPEGCod

在windows和Linux上安装ImageMagick与jmagick,Maven配置、Java图片压缩代码(整理网上、结合自己情况、编写出来的新安装方式)

安装过程(如图所示)   若想使用imagemagick,需要安装各种依赖库.一步小心,可能就会安装错误.其中ImageMagick的访问地址为: http://www.imagemagick.org/script/index.php 2.安装支持库 Linux服务器如果没有安装Jpeg v6b.libPng.FreeType库,要在安装imagemagick之前先装好,否则imagemagick没法读取jpeg和png图片,字体文件也读不了.(本次安装以redHat为例,进行ImageMagi

java图片压缩 尺寸不变

问题描述 已经实现了图片的压缩,尺寸也没变,问题是如何才能压缩成想要的大小,压缩率该如何计算呢实在搜索不到了,望高手指点!

java实现图片压缩的思路与代码_java

本文实例为大家分享了java实现图片压缩的相关代码,供大家参考,具体内容如下 import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; public class ImageProcess {

java问题-图片压缩时遇到问题,高手进,拜谢啊

问题描述 图片压缩时遇到问题,高手进,拜谢啊 问题描述: 使用thumbnailator时nested exception is java.lang.OutOfMemoryError: Java heap space 上传图片后使用thumbnailator进行压缩,所有手机拍摄的图片没有问题.美工做的图,在压缩过程中报溢出错误. 挣扎,求解

递归-java 打包压缩下载出错,求大神帮忙

问题描述 java 打包压缩下载出错,求大神帮忙 代码在这里 package cn.mobilizer.channel.image.vo; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.ut

Android图片压缩(质量压缩和尺寸压缩)

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图.两种方法都实装在了我的项目中,结果却发现在质量压缩的模块中,本来1.9M的图片压缩后反而变成3M多了,很是奇怪,再做了进一步调查终于知道原因了.下面这个博客说的比较清晰: android图片压缩总结 总结来看,图片有三种存在形式:硬盘上时是fi

Android编程之Bitmap图片压缩大小

itmap图片太大,会造成内存溢出.一般的都有图片预览机制,就是得到一张尺寸小一点的图片. 这里所谓的缩小尺寸可不是指在layout中设置一下宽高使图片缩小(其实质还是一张占内存大图),而是实实在在的将图片本身缩小,减小内存占用. 以下是方法,详细说明都在注释里了: [java] view plaincopy private Bitmap revitionImageSize(String path, int size) throws IOException {           // 取得图片