您的位置 首页 java

「JavaEE」Java SDK实现图片质量压缩

「JavaEE」Java SDK实现图片质量压缩

爱书客ibooker提供

本篇文章主要讲的是通过Java SDK实现对图片的质量压缩,即图片尺寸不变,压缩图片文件大小。而在本例中主要是征对 png 图片而言,再说Java SDK实现图片质量压缩之前,要先了解常见图片的一些特性。

jpg 格式

  • 可支持有陨压缩

  • 不支持透明

  • 不支持动画

  • 非矢量

JPG图片其实一生成出来就已经是有损的了,它是把一些不打算存储的数据抹擦掉,它的色彩还原度比较好,可以支持适当压缩后保持比较好的色彩度,如果你图片颜色很多的,建议使用这个图片格式,可以使生成的图片大小比较小而不会使图片看起来很模糊(失真) 。

jpeg格式

  • 可支持有陨压缩

  • 不支持透明

  • 不支持动画

  • 非矢量

与jpg格式相似,经常在拷相片的时候看到得,但我们制作图片的时候一般是保存jpg,该种图片格式是文件相对jpg大,因为里面存储了很多相机里的拍摄参数,像色相、饱和度、对比度等,可用于直接打印和印刷(相对于jpg要好) 。

PNG格式

  • 不支持压缩

  • 支持透明、半透明、不透明

  • 不支持动画

  • 非矢量

网页设计中为了使图片下面的背景颜色显示出来,我们经常会使用png24透明的图片, png8是类似gif的透明度,有带半透明(alpha为50%)的地方的时候以不透明处理。

png图片如果色彩较多或复杂,则图片生成后的格式是很大的,相比较jpg的放有5~6倍之多,所以没特别要求不能以png替代jpg的使用。

png图片多用于网页中的图标设计。

IE6不支持png透明特性,有png的地方会以灰色底显示,相当难看,不过ie6已经慢慢淡出了我们的视线,相信png的应用会得到更广泛。

GIF格式

  • 可支持有陨压缩

  • 不支持全透明、半透明

  • 支持动画

  • 非矢量

该格式的图片位深相对较底,只支持web色颜色种类有限,无法过渡平滑。使用该格式的场景:网页背景、小图标、色彩度低的小切片、动画图片;

BMP格式

  • 可支持有陨压缩

  • 不支持透明

  • 不支持动画

  • 非矢量

Windows格式,windows操作系统特有的图片,该图片保存了大量的图片数据,所以图片相对是比较大的,色彩度很真实,windows的桌面就是bmp格式的,通过设了桌面背景后,会在系统生成张bmp的图片用于保存该桌面壁纸,缺点:图片格式较大。

TIFF格式

  • 不支持压缩

  • 不支持透明

  • 不支持动画

  • 非矢量

印刷格式,色彩真实,支持保存图层(像 psd ,但像路径、蒙版等不可保存),通常发给印刷公司的图片就是用这种格式的。

了解了常见格式图片的一些特性之后,接下来就是本讲的重点:Java SDK实现图片质量压缩。

分析

一、读取文件 :图片文件是保存在内存当中,要想对其进行操作,首先要读取它在内存中的数据,如果连数据都获取不到,那就更别提压缩处理了,这里就牵扯到流,在javax.imageio.*包下提供了一个ImageIO类,该类提供ImageReader和ImageWriter来实现对图片的读取和写入。

二、 转码 :通过上面介绍,可以知道能够支持压缩的图片格式并不是很多,而jpeg能够支持各种格式程度的压缩方式,压缩效果好。所以在不明确 源文件 格式的情况下,先转码成jpeg格式是一个不错的选择。

三、质量压缩 :ImageWriteParam这个对象提供setCompressionQuality可以对图片进行压缩,最后对压缩之后的数据进行合成成图片。

实现

首先要获取图片的BufferedImage流,即读取图片内存数据。

File file = new File(imagePath);// imagePath源文件路径

BufferedImage bufferedImage = ImageIO.read(file);// 获取BufferedImage流

其次获取图片文件的ImageWriter,来实现图片文件的重构。

// 得到指定Format图片的writer

Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(“jpeg”);// 得到 迭代器

ImageWriter writer = (ImageWriter) iter.next(); // 得到writer

接下来就是比较核心的内容,压缩图片。

// 得到指定writer的输出参数设置(ImageWriteParam)

ImageWriteParam iwp = writer.getDefaultWriteParam();

iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 设置可否压缩

iwp.setCompressionQuality(quality); // 设置压缩质量参数,0~1,1为最高质量

iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);

ColorModel colorModel = ColorModel.getRGBdefault();

// 指定压缩时使用的色彩模式

iwp.setDestinationType(new ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));

// 开始打包图片,写入 byte []

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 取得内存输出流

IIOImage iIamge = new IIOImage(bufferedImage, null, null);

// 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput

// 通过ImageIo中的 静态方法 ,得到byteArrayOutputStream的ImageOutput

writer.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream));

writer.write(null, iIamge, iwp);

最后获取压缩图片的ByteArrayOutputStream,转化成图片文件。

// 获取压缩后的btye

byte[] tempByte = byteArrayOutputStream.toByteArray();

// 创建输出文件,outputPath输出文件路径,imgStyle目标文件格式(png)

File outFile = new File(outputPath + “.” + imgStyle);

FileOutputStream fos = new FileOutputStream(outFile);

fos.write(tempByte);

fos.close();

到这里图片压缩就已经全部完成,不过该方式压缩对GIF的压缩并不是很好,所以不适用于GIF。

文章来源:智云一二三科技

文章标题:「JavaEE」Java SDK实现图片质量压缩

文章地址:https://www.zhihuclub.com/180075.shtml

关于作者: 智云科技

热门文章

网站地图