我正在尝试将jpg图像检索为BufferedImage
,然后将其分解为3D数组[RED][GREEN][BLUE]
,然后将其转换回BufferedImage
并将其存储在不同的文件下 - 名称。所有看起来都很好但是当我尝试使用创建的新文件重新加载3D数组时,我得到了不同的RGB值,尽管新图像看起来很好。我做了以下。
BufferedImage bi = ImageIO.read(new File("old.jpg"));
int[][][] one = getArray(bi);
save("kite.jpg", one);
BufferedImage bi2 = ImageIO.read(new File("new.jpg"));
int[][][] two = getArray(bi2);
private void save(String destination, int[][][] in) {
try {
BufferedImage out = new BufferedImage(in.length, in[0].length, BufferedImage.TYPE_3BYTE_BGR);
for (int x=0; x<out.getWidth(); x++) {
for (int y = 0; y < out.getHeight(); y++) {
out.setRGB(x, y, new Color(in[x][y][0], in[x][y][1], in[x][y][2]).getRGB());
}
}
File f = new File("name");
ImageIO.write(out, "JPEG", f);
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
所以在上面的例子中,数组one
和two
所持有的值是不同的。
我猜测不同类型的检索和恢复图像有什么关系?我想弄清楚一整天都在发生什么,但没有运气。任何帮助表示赞赏。
答案 0 :(得分:0)
非常简单:
JPEG是一种常用的数字图像有损压缩方法
(来自wikipedia)。 每次压缩图像时,都会更改图像以减小文件大小。实际上,重复几百次的解压缩和压缩步骤会将图像改变为大多数情况下整个图像变成普通灰色区域的点。有一些压缩工作无损,但大多数操作模式会改变图像。