【发布时间】: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 图像都使用相同的压缩。这是一个可以随每个图像而变化的设置。您正在编写的文件与原始文件的压缩设置不同。