为什么JPG在检索时被更改JAVA

为什么JPG在检索时被更改JAVA,java,bufferedimage,Java,Bufferedimage,我试图将jpg图像检索为缓冲图像,然后将其分解为3D数组[红色][绿色][蓝色],然后将其转换回缓冲图像,并将其存储在不同的文件名下。对我来说一切都很好,但是当我尝试使用创建的新文件重新加载3D阵列时,我得到了不同的RGB值,尽管新图像在肉眼看来很好。我做了以下几件事 BufferedImage bi = ImageIO.read(new File("old.jpg")); int[][][] one = getArray(bi); save("kite.jpg", one); Buffere

我试图将jpg图像检索为
缓冲图像
,然后将其分解为3D数组
[红色][绿色][蓝色]
,然后将其转换回
缓冲图像
,并将其存储在不同的文件名下。对我来说一切都很好,但是当我尝试使用创建的新文件重新加载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());
    }

}
BufferedImage bi=ImageIO.read(新文件(“old.jpg”);
int[]one=getArray(bi);
保存(“kite.jpg”,一个);
buffereImage bi2=ImageIO.read(新文件(“new.jpg”);
int[]two=getArray(bi2);
专用void保存(字符串目标,int[]in){
试一试{
BuffereImage out=新的BuffereImage(in.length,in[0]。length,buffereImage.TYPE_3BYTE_BGR);
对于(intx=0;x非常简单:

JPEG是一种常用的数字图像有损压缩方法

(来自)。
每次压缩图像时,图像都会被更改以减小文件大小。事实上,重复解压和压缩的步骤数百次会使图像在大多数情况下变为纯灰色区域。有一些压缩是无损的,但大多数操作模式会改变图像大小图像。

听起来像是JPEG压缩在您存储它时只是稍微调整了值。JPEG是一种有损格式,它在保存时会丢失一些颜色信息。仅作为写入使用一次format@Ferrybig我想你的意思是有损。有关于如何控制参数的详细信息,FWIW。我在那个问题上尝试了这两个答案,但没有多大帮助…我不知道为什么。在提高压缩质量时,我的像素变化似乎较少,但从来没有实现过无损