如下所示,我将第一张图像作为原始JPEG图像。第二张图像用于缓冲图像,而不是使用1.0质量的http://www.lac.inpe.br/JIPCookbook/6040-howto-compressimages.jsp保存。静止图像尺寸变小,失真很小。是否可以将图像保存到其质量中?请注意,保存图像不仅仅是一个样本测试。添加文本后,我将其保存为最高质量,这也会丢失信息。
答案 0 :(得分:6)
不要重绘图像并保存。只需复制原始字节!
我怀疑你当前的代码是这样的:
BufferedImage image = ImageIO.read(new File("my.jpg");
ImageIO.write(image, "jpg", new File("copy.jpg"));
每次重复此操作时,图像都会稍微改变(因为您看到总是松开一些质量)。如果您只想复制JPEG /文件而不更改任何内容,可以执行以下操作(从此页http://www.exampledepot.com/egs/java.io/CopyFile.html开始):
void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
答案 1 :(得分:1)
即使原始图像数据来自JPEG,即使具有最高质量设置,JPEG也始终是有损的。
有一些操作,如旋转/镜像/裁剪,可以在JPEG上无损耗(使用像jpegtran这样的工具),但这些是罕见的例外。
无论如何,您似乎可以访问原始JPG图像并且不进行更改,因此我不明白为什么要再次压缩它。
如果你真的必须存储这些无损图像,最好的选择是使用JPEG2000的无损模式,这比使用JPG压缩的图像数据的PNG等其他替代品提供了更小的文件大小(尽管它仍然大得多)比原来的JPG)。例如,对于您的第一个示例图片:
hAw2d.jpg -> 268,678 bytes (Original)
hAw2d.jp2 -> 1,021,007 bytes (JPEG 2000, lossless)
hAw2d.png -> 1,213,392 bytes (PNG)