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

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,原理调用其他程序处理图片,非常非常快,可以参考一下。

相关推荐

    java图片压缩处理

    java图片压缩处理java图片压缩处理java图片压缩处理java图片压缩处理java图片压缩处理java图片压缩处理

    java图片压缩处理(可以压缩为任意大小

    在Java编程语言中,处理图片压缩是一项常见的任务,特别是在存储、传输或展示大量图像资源时。本主题将深入探讨如何使用Java实现图片压缩,并能够将其调整到任意大小,同时保持图片质量并避免变形。 首先,我们需要...

    java高清图片压缩的2种方法

    首先,我们来看看使用Java标准库中的`javax.imageio.ImageIO`类进行图片压缩。`ImageIO`类提供了读取、写入和处理图像的功能。以下是一个简单的示例,展示如何读取一个图片文件,然后以较低的质量重新保存,从而达到...

    Java 图片压缩

    以下是一个简单的Java图片压缩示例: ```java import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImageCompressor { public ...

    java图片压缩处理 支持gif

    "java图片压缩处理 支持gif"这个标题表明我们将探讨如何使用Java来处理和压缩GIF动态图,因为GIF格式支持动画,处理起来相对复杂。 首先,Java标准库提供了`javax.imageio`包,它包含`ImageIO`类,可以用来读取、...

    Java做图片压缩的代码

    在Java编程环境中,图片压缩和生成缩略图是常见的任务,尤其在处理大量图像数据或者优化网站性能时显得尤为重要。本文将深入探讨如何利用Java进行图片处理,包括压缩和生成缩略图的关键技术。 首先,Java提供了丰富...

    java图片压缩文件大小图片大小(支持gif动态图)

    在Java编程语言中,处理图片压缩是一个常见的任务,特别是在网页开发、存储优化或者移动应用中。这个主题主要涉及如何利用Java来减少图片文件的大小,包括静态图片(如JPEG、PNG)以及动态图片(如GIF)。下面我们将...

    java版图片压缩方法

    #### Java图片压缩代码解析 给定的代码示例主要展示了如何使用Java进行图片的无损压缩处理。具体步骤如下: 1. **读取源图像**:首先,通过`ImageIO.read()`方法读取源图片文件到`Image`对象中。 2. **缩放图像**...

    java图片压缩

    在Java编程语言中,处理图像是一项常见的任务,其中包括图片压缩。`ImageSizer.java`这个文件很可能是实现了一个简单的图片压缩工具类。在这个类中,开发者可能已经实现了对JPG、PNG和GIF(非动态)格式图片的压缩...

    java图片压缩通用类

    但是,这个"java图片压缩通用类"可能是开发者自定义的一个类,它可能封装了一些常见的图像处理操作,如调整尺寸、改变质量参数以及保存为不同的格式。 图片压缩通常涉及两个主要方面:尺寸压缩和质量压缩。尺寸压缩...

    java 图片压缩 iphone拍照上传旋转问题处理压缩工具类

    本篇文章将详细介绍如何利用Java来处理这个问题,特别是如何编写一个图片压缩和旋转的工具类。 首先,我们需要引入处理图像元数据和压缩的库。在Java中,一个常用的库是Apache的Commons Imaging,它以前称为JAI-...

    PngEncoder.java针对java平台处理png压缩算法

    PngEncoder.java针对java平台处理png压缩算法

    java web 图片压缩

    在Java Web开发中,图片处理是一项常见的需求,无论是用于网站展示、用户上传的头像处理,还是电商系统中的商品图片优化。本项目专注于图片的压缩功能,提供了简单易用的API,可以对图片进行缩放和降质处理,并且...

    java各种方式压缩图片

    在Java编程环境中,图片压缩是一项常见的任务,尤其在处理用户上传的图像时,为了节省存储空间、优化网页加载速度或符合服务器对文件大小的限制,往往需要对图片进行压缩。以下是一些Java实现图片压缩的方法: 1. *...

    图片缩放、压缩技术java实现

    Java提供了多种库来处理图片压缩,如Apache Commons Imaging(旧称Sanselan)和ImageMagick的Java绑定。其中,Java Advanced Imaging (JAI) 是Java标准扩展的一部分,它提供了丰富的图像处理功能,包括压缩。 使用...

    Java中上传图片压缩处理的方法示例

    Java中图片压缩处理是一项重要的技术手段,尤其在Web应用中,用户上传图片时...通过上述的Java图片压缩处理方法,可以在不同的应用场景中,灵活地对上传的图片进行处理,以达到节省存储空间、加快页面加载速度的目的。

    java实现视频压缩

    例如,可以使用JPEG或PNG等图片压缩算法对每一帧进行压缩。 4. **音频处理**:如果视频包含音频,也需要进行压缩。可以使用MP3、AAC等音频编码格式。 5. **打包与写入**:将压缩后的音频和视频数据按照特定的容器...

    java 图片压缩 加水印处理 可以批处理

    java 可以处理19.5 M以下的正常图片 , 不知道大图怎么处理 只能ps 了, jdk可能不行

    java压缩上传图片

    通过以上知识点的介绍,我们了解了如何使用Java进行图片压缩的操作,特别是在处理身份证等证件图片时的特殊需求。同时,通过保持图片的纵横比,可以有效避免图片失真问题。此外,还可以通过自定义图片尺寸来灵活适应...

    Thumbnails 纯java图片压缩api 包括文档及相关学习资料

    总之,Thumbnails 纯Java图片压缩API是一个强大且高效的图片处理工具,它简化了Java开发者进行图片压缩和其他处理的任务,同时提供了丰富的文档和学习资源,使得学习和应用变得更为容易。无论你是新手还是经验丰富的...

Global site tag (gtag.js) - Google Analytics