将图像转换为像素数组,使用像素重新创建图像-尺寸减小。为什么?

8
我将一张图像转换为一个由像素组成的数组,将RGB值保存在三个单独的数组中。之后,我尝试使用相同的值创建图像(无操纵)。在黑白图像的情况下,原始图像大小为205kB,新图像大小为121kB,在彩色图像的情况下,从215kB减少到96kB。同时,亮度略有变化(亮度增加并且总体对比度也增加)。是什么原因导致了这种情况?
我已经尝试过彩色和黑白图像,结果是相同的。
另外,我在先前输出的图像(96kB)上运行了相同的代码,新输出仍然是96kB。 代码-
1) 读取图像:
int width = img.getWidth(null);
int height = img.getHeight(null);

pixelR = new int[width * height];
pixelG = new int[width * height];
pixelB = new int[width * height];

int index=0;

int r, g, b, gray, rgb;

for(int i=0; i<width; i++) {
  for (int j=0; j<height; j++) {
    rgb = img.getRGB(i, j);

    r = (rgb >> 16) & 0xFF;
    g = (rgb >> 8) & 0xFF;
    b = (rgb & 0xFF);

    pixelR[index]=r;
    pixelG[index]=g;
    pixelB[index]=b;
    index++;
  }
}

2) 写入图像:

     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

  int index=0;
  int val;
  int r, g, b;

  for (int i=0; i<width; i++) {
    for (int j=0; j<height; j++) {

      r=pixelR[index];
      g=pixelG[index];
      b=pixelB[index++];

      Color newColor = new Color((int)r, (int)g, (int)b);     
      image.setRGB(i, j, newColor.getRGB());
    }
  }

  File f = null;

  try{
    f = new File("<filepath>.jpg");
      ImageIO.write(image, "jpg", f);
    }catch(IOException e){
      System.out.println("Error: "+e);
    }
  }

3
也许你的写作质量比原始图像低? - Oliver Charlesworth
1
pixelR[index]=r; pixelG[index]=r; pixelB[index]=r; 你一遍又一遍地赋予相同的值。这是打字错误吗? - TDG
@TDG 是的,打错了。已更正。 - Bugs Buggy
@OliverCharlesworth 两张图片都是JPG文件。 - Bugs Buggy
3
.jpg文件的结构:https://zh.wikipedia.org/wiki/JPEG - zlakad
2
别人试图告诉你的是,并非所有的JPEG图像都使用相同的压缩方式。这是一个可以因每个图像而异的设置。你正在写入的文件具有与原始文件不同的压缩设置。 - VGR
1个回答

1
你可以尝试将压缩级别设置为不同的值,然后查看文件大小如何随之而异。请参阅在Java中使用ImageIO设置jpg压缩级别了解如何操作。
但这并不能解释亮度和对比度的变化。

如果是这样的话,如果我将输出图像作为输入图像提供,那么输出图像不会再次被压缩吗?例如,一张图片 image1 是100kB,当我在其上运行程序并将其压缩为60kB时,它被保存为 output1,现在如果我在它上面运行程序并将其保存为 output2,那么这60kB的图像应该再次被压缩,但事实并非如此,output2 也是60kB。 - Bugs Buggy
不,通常情况下你不能多次压缩以获得正面效果(减小文件大小)。如果可以的话,你可以连续多次压缩,最终得到一个只有一个字节大小的文件。这个结果文件将无法以类似的质量编码图像。压缩依赖于检测数据中的模式并高效地对其进行编码。使用许多常见算法时,当在已经压缩过的数据上第二次运行时,无法检测到节省空间的模式。 - sebkur
1
请参考以下关于多次压缩数据的一般讨论问题:https://dev59.com/mnA75IYBdhLWcg3wm6ex - sebkur
但是我认为JPEG是有损压缩,而不是无损的? - Bugs Buggy
1
是的,JPEG 是有损压缩。但是,多次运行 JPEG 压缩并不会在每次迭代中降低质量。 - sebkur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接