`
cuisuqiang
  • 浏览: 3931987 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3647310
社区版块
存档分类
最新评论

Java中图片压缩处理

    博客分类:
  • JDK
阅读更多

整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享。
首先,要压缩的图片格式不能说动态图片,你可以使用bmp、png、gif等,至于压缩质量,可以通过BufferedImage来指定。
在C盘的temp下放置一张图片pic123.jpg,尽量找一个像素高一点的图片,这里我找了一张5616*3744的。

 

package test;
import java.io.*;
import java.util.Date;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.*;
/**
 * 图片压缩处理
 * @author 崔素强
 */
public class ImgCompress {
	private Image img;
	private int width;
	private int height;
	@SuppressWarnings("deprecation")
	public static void main(String[] args) throws Exception {
		System.out.println("开始:" + new Date().toLocaleString());
		ImgCompress imgCom = new ImgCompress("C:\\temp\\pic123.jpg");
		imgCom.resizeFix(400, 400);
		System.out.println("结束:" + new Date().toLocaleString());
	}
	/**
	 * 构造函数
	 */
	public ImgCompress(String fileName) throws IOException {
		File file = new File(fileName);// 读入文件
		img = ImageIO.read(file);      // 构造Image对象
		width = img.getWidth(null);    // 得到源图宽
		height = img.getHeight(null);  // 得到源图长
	}
	/**
	 * 按照宽度还是高度进行压缩
	 * @param w int 最大宽度
	 * @param h int 最大高度
	 */
	public void resizeFix(int w, int h) throws IOException {
		if (width / height > w / h) {
			resizeByWidth(w);
		} else {
			resizeByHeight(h);
		}
	}
	/**
	 * 以宽度为基准,等比例放缩图片
	 * @param w int 新宽度
	 */
	public void resizeByWidth(int w) throws IOException {
		int h = (int) (height * w / width);
		resize(w, h);
	}
	/**
	 * 以高度为基准,等比例缩放图片
	 * @param h int 新高度
	 */
	public void resizeByHeight(int h) throws IOException {
		int w = (int) (width * h / height);
		resize(w, h);
	}
	/**
	 * 强制压缩/放大图片到固定的大小
	 * @param w int 新宽度
	 * @param h int 新高度
	 */
	public void resize(int w, int h) throws IOException {
		// SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
		BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB ); 
		image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图
		File destFile = new File("C:\\temp\\456.jpg");
		FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流
		// 可以正常实现bmp、png、gif转jpg
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		encoder.encode(image); // JPEG编码
		out.close();
	}
}

 

运行后在C盘temp下生成一个465.jpg,像素大小为600*400,像素大小是我指定的。用时也就是一两秒的事情,注意,我这张图片是10M的,压缩后是40.5KB
一些细节事项可以参考代码中的注释。

 

要注意的是,你可能想试一试较大图片的处理能力,如果你的JDK没有指定默认内存,那可能会有如下异常,因为内存不够大:

开始:2014-4-14 16:25:11
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:58)
	at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
	at java.awt.image.Raster.createWritableRaster(Raster.java:938)
	at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1169)
	at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:943)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:915)
	at javax.imageio.ImageIO.read(ImageIO.java:1422)
	at javax.imageio.ImageIO.read(ImageIO.java:1282)
	at test.ImgCompress.<init>(ImgCompress.java:31)
	at test.ImgCompress.main(ImgCompress.java:21)

 

解决方法:
在Eclipse里选:Window->Preference->Installed JREs->Edit(选中jre),
在Default VM Arguments里输入-Xms256m -Xmx1024m,表示最小内存256M,最大1G,然后运行就可以了

 

请您到ITEYE网站看 java小强 原创,谢谢!
http://cuisuqiang.iteye.com/

自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

15
5
分享到:
评论
18 楼 longen2011 2016-07-21  
大哥,用了你的压缩,我的图片不是变小而是变大了,啥情况?
17 楼 javaguy2014 2016-02-25  
       
16 楼 2047699523 2015-04-25  
Java压缩图片util,可等比例宽高不失真压缩,也可直接指定压缩后的宽高
http://www.zuidaima.com/share/2156534163491840.htm
15 楼 桐华长相思 2014-09-29  
Java代码  收藏代码
开始:2014-4-14 16:25:11 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:58) 
    at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397) 
    at java.awt.image.Raster.createWritableRaster(Raster.java:938) 
    at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1169)  www.48yl.com
    at javax.imageio.ImageReader.getDestination(ImageReader.java:2879) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:943) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:915) 
    at javax.imageio.ImageIO.read(ImageIO.java:1422) 
    at javax.imageio.ImageIO.read(ImageIO.java:1282) 
    at test.ImgCompress.<init>(ImgCompress.java:31) 
    at test.ImgCompress.main(ImgCompress.java:21) 
14 楼 cuisuqiang 2014-05-05  
雪飘寒 写道
cuisuqiang 写道
雪飘寒 写道
houyujiangjun 写道
GraphicsMagick    结题.
这种东西绝不能用java处理.


其实im4j就是调用GraphicsMagick,看实际需求了,java处理简单的小图片可以,像素大的图片,非常非常慢,可以并发几个线程一起干,用个10M的图片试试

找一张几十M的图片还真不容易,不过我还是试了一下,顶得住


嗯,cpu好的话就没问题,能满足的话就没必要弄的很复杂

根据实际情况而定,不能为了技术而技术
13 楼 雪飘寒 2014-05-05  
cuisuqiang 写道
雪飘寒 写道
houyujiangjun 写道
GraphicsMagick    结题.
这种东西绝不能用java处理.


其实im4j就是调用GraphicsMagick,看实际需求了,java处理简单的小图片可以,像素大的图片,非常非常慢,可以并发几个线程一起干,用个10M的图片试试

找一张几十M的图片还真不容易,不过我还是试了一下,顶得住


嗯,cpu好的话就没问题,能满足的话就没必要弄的很复杂
12 楼 cuisuqiang 2014-05-05  
雪飘寒 写道
houyujiangjun 写道
GraphicsMagick    结题.
这种东西绝不能用java处理.


其实im4j就是调用GraphicsMagick,看实际需求了,java处理简单的小图片可以,像素大的图片,非常非常慢,可以并发几个线程一起干,用个10M的图片试试

找一张几十M的图片还真不容易,不过我还是试了一下,顶得住
11 楼 雪飘寒 2014-05-05  
houyujiangjun 写道
GraphicsMagick    结题.
这种东西绝不能用java处理.


其实im4j就是调用GraphicsMagick,看实际需求了,java处理简单的小图片可以,像素大的图片,非常非常慢,可以并发几个线程一起干,用个10M的图片试试
10 楼 finallygo 2014-04-17  
houyujiangjun 写道
GraphicsMagick    结题.
这种东西绝不能用java处理.

是因为效率低还是质量差?
9 楼 houyujiangjun 2014-04-17  
GraphicsMagick    结题.
这种东西绝不能用java处理.
8 楼 fair_jm 2014-04-16  
看了下代码 这是压缩?? 这是缩放吧... ...
7 楼 aa87963014 2014-04-16  
压缩跟缩放完全是两码事
6 楼 cuisuqiang 2014-04-15  
雪飘寒 写道
Java处理简单数量小的图片还可以,复杂大量的就不行的,可以使用img4j,原理调用其他程序处理图片,非常非常快,可以参考一下。

后续学习一下
5 楼 kuchaguangjie 2014-04-15  
有些不错的开源框架, 使用非常简单,
4 楼 zhanghq0717 2014-04-15  
 
3 楼 sanshizi 2014-04-15  
非常好
2 楼 finallygo 2014-04-15  
谢谢了,正好需要用到
1 楼 雪飘寒 2014-04-15  
Java处理简单数量小的图片还可以,复杂大量的就不行的,可以使用img4j,原理调用其他程序处理图片,非常非常快,可以参考一下。

相关推荐

Global site tag (gtag.js) - Google Analytics