【问题标题】:Convert image into array of pixels, recreate image using pixels - size gets reduced. Why?将图像转换为像素数组,使用像素重新创建图像 - 尺寸减小。为什么?
【发布时间】:2018-06-10 02:32:06
【问题描述】:

我将图像转换为像素数组。我将 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);
    }
  }

【问题讨论】:

  • 也许您的写作质量低于原始图像?
  • pixelR[index]=r; pixelG[index]=r; pixelB[index]=r; 您一次又一次地分配相同的值。是不是笔误?
  • @TDG 是的,错字。已更正。
  • .jpg 文件的结构:en.wikipedia.org/wiki/JPEG
  • 其他人试图告诉您的是,并非所有 JPEG 图像都使用相同的压缩。这是一个可以随每个图像而变化的设置。您正在编写的文件与原始文件的压缩设置不同。

标签: java image


【解决方案1】:

您可以尝试将压缩级别设置为不同的值,并查看文件大小如何不同。请参阅Setting jpg compression level with ImageIO in Java 了解如何执行此操作。

虽然没有解释亮度和对比度的变化。

【讨论】:

  • 如果是这样的话,如果我提供输出图像作为输入图像,输出图像不会被再次压缩吗?例如,一个图像 image1 是 100kB ,当我在其上运行程序时压缩到 60kB 并保存为 output1,现在应该再次压缩 60kB 图像如果我在上面运行程序并将其另存为 output2,情况并非如此,output2 也是 60kB。
  • 不,通常不能多次压缩以产生积极影响(减小大小)。如果是这种情况,您可以连续多次压缩并得出一个只有一个字节的文件。生成的文件将无法以相似的质量对图像进行编码。压缩依赖于检测数据中的模式并有效地对其进行编码。使用许多常用算法,在已经压缩的数据上再次运行时,无法检测到节省空间的模式。
  • 关于多次压缩数据的一般讨论请参阅此问题:stackoverflow.com/questions/3198666/…
  • 但我认为 JPEG 是有损压缩,而不是无损压缩?
  • 是的,JPEG 是有损的。尽管如此,多次运行 JPEG 压缩并不会降低每次迭代的质量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
相关资源
最近更新 更多