整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享。
首先,要压缩的图片格式不能说动态图片,你可以使用bmp、png、gif等,至于压缩质量,可以通过BufferedImage来指定。
在C盘的temp下放置一张图片pic123.jpg,尽量找一个像素高一点的图片,这里我找了一张5616*3744的。
代码如下 | 复制代码 |
packagetest; importjava.io.*; importjava.util.Date; importjava.awt.*; importjava.awt.image.*; importjavax.imageio.ImageIO; importcom.sun.image.codec.jpeg.*; /** * 图片压缩处理 * @author 崔素强 */ publicclassImgCompress { privateImage img; privateintwidth; privateintheight; @SuppressWarnings("deprecation") publicstaticvoidmain(String[] args)throwsException { System.out.println("开始:"+newDate().toLocaleString()); ImgCompress imgCom =newImgCompress("C:\temp\pic123.jpg"); imgCom.resizeFix(400,400); System.out.println("结束:"+newDate().toLocaleString()); } /** * 构造函数 */ publicImgCompress(String fileName)throwsIOException { File file =newFile(fileName);// 读入文件 img = ImageIO.read(file); // 构造Image对象 width = img.getWidth(null); // 得到源图宽 height = img.getHeight(null);// 得到源图长 } /** * 按照宽度还是高度进行压缩 * @param w int 最大宽度 * @param h int 最大高度 */ publicvoidresizeFix(intw,inth)throwsIOException { if(width / height > w / h) { resizeByWidth(w); }else{ resizeByHeight(h); } } /** * 以宽度为基准,等比例放缩图片 * @param w int 新宽度 */ publicvoidresizeByWidth(intw)throwsIOException { inth = (int) (height * w / width); resize(w, h); } /** * 以高度为基准,等比例缩放图片 * @param h int 新高度 */ publicvoidresizeByHeight(inth)throwsIOException { intw = (int) (width * h / height); resize(w, h); } /** * 强制压缩/放大图片到固定的大小 * @param w int 新宽度 * @param h int 新高度 */ publicvoidresize(intw,inth)throwsIOException { // SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢 BufferedImage image =newBufferedImage(w, h,BufferedImage.TYPE_INT_RGB ); image.getGraphics().drawImage(img,0,0, w, h,null);// 绘制缩小后的图 File destFile =newFile("C:\temp\456.jpg"); FileOutputStream out =newFileOutputStream(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-1416:25:11
代码如下 | 复制代码 |
Exception in thread"main"java.lang.OutOfMemoryError: Java heap space at java.awt.image.DataBufferByte. 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. at test.ImgCompress.main(ImgCompress.java:21) |
解决方法:
在Eclipse里选:Window->Preference->Installed JREs->Edit(选中jre),
在Default VM Arguments里输入-Xms256m -Xmx1024m,表示最小内存256M,最大1G,然后运行就可以了
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整