为任何无知道歉,但我以前从未使用过Java中的jpeg图像(更不用说任何类型的图像)了。
假设我想将一个jpeg图像从Web服务发送到客户端。有没有什么方法可以通过某种方式操纵图像的颜色配置文件来减少jpeg文件的大小?
我已经能够通过使用名为imgscalr
的BufferedImages的简洁工具来缩小图像大小。请参阅here。
我还想要一个颜色比高质量jpeg图像少的jpeg。例如,我希望能够在我的jpeg中使用8位颜色而不是16位颜色。
如果我有来自Java 2D包的BufferedImage,我到底需要改变什么呢?
答案 0 :(得分:4)
减少图像大小的另一种方法是更改压缩级别。你可以使用ImageWriter来做到这一点。
ImageWriter writer = null;
Iterator<ImageWriter> iwi = ImageIO.getImageWritersByFormatName("jpg");
if (!iwi.hasNext())
return;
writer = (ImageWriter) iwi.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT) ;
iwp.setCompressionQuality(compressionQuality);
writer.setOutput(...);
writer.write(null, image, iwp);
答案 1 :(得分:1)
最简单的方法是将字节流解压缩为Java Image,可选择调整其大小(使其更小),然后使用所需的质量设置从中重新生成JPEG图像。
然后,这个新图像将发送给客户端。
答案 2 :(得分:1)
查看ImageIO
课程。至于减小文件大小:由于图像已经是JPEG,你唯一能做的就是降低质量或图像尺寸。
要记住的另一件事:如果图像是CMYK jpeg,它可能会更大。遗憾的是ImageIO
无法处理这些问题,但您可以尝试JAI ImageIO
将CMYK转换为RGB(应该更小)。
答案 3 :(得分:1)
其中两种可能的解决方案是降低图像尺寸,以下是您的工作方式:
BufferedImage original = //your image here
scaled = original.getScaledInstance(finalWidth, finalHeight, Image.SCALE_SMOOTH); // scale the image to a smaller one
BufferedImage result = new BufferedImage(finalWidth, finalHeight, original.getType());
Graphics2D g = result.createGraphics();
g.drawImage(scaled, 0, 0, null); //draw the smaller image
g.dispose();
显然,您必须计算缩放的宽度和高度,以使图像保持相同的宽高比。
将图像缩小后,您现在可以将此图像转换为JPEG文件:
BufferedImage image = // this is the final scaled down image
JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(output);
JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);
jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
jpegEncodeParam.setXDensity(92);
jpegEncodeParam.setYDensity(92);
jpegEncodeParam.setQuality( 0.8F , false);
jpegEncoder.encode(image, jpegEncodeParam);
这些类来自 JAI 包(更确切地说是 com.sun.image.codec.jpeg ),JVM可能会抱怨它们不应该直接使用,但你可以忽略它。
您可以从here下载JAI,如果它不起作用我为两个库设置了github镜像,JAI core和JAI ImageIO。