下面是示例代码。代码工作完美,创建的图像准确。但是创建的图像(当读回并放入像素时)的像素值似乎为1或2。我正在做一个简单的测试,在像素被读入时,以及在它们被保存回文件之前打印它们。然后,我在新图像上运行另一个测试程序,打印的像素值为1或2(以像素为单位,如“24”到“25”)。但大多数像素是准确的,只有少数是不准确的。是否与图像的回写方式有关?
try
{
//Read in image
BufferedImage imgBuf = ImageIO.read(new File("image.jpg"));
//take in pixels etc., and simply do nothing with them - testing puposes
//Write back the image
BufferedImage bufferedImage = new BufferedImage(imagePixelArray[0].length, imagePixelArray.length, BufferedImage.TYPE_INT_RGB);
ImageIO.write(bufferedImage, "jpeg", new File("new-image.jpg"));
}
catch(IOException i){};
编辑
下面是如何将像素拆分为数组,然后使用位移位重新分配回数组的代码。同样,不要担心程序的逻辑。我需要确保这些像素(表示为红像素、绿像素和蓝像素)在读回新创建的图像时是相同的。下面的代码使用上面使用BuffereImage的代码。我确实使用了gif文件。但是我知道有一种方法可以正确地编码JPEG(而不是压缩数据)
int i=0;
//Loop through RGBarray[] assigning their respecctive colour components using bit shifting
//jpegPixels[255][255][3] - the third part of the array is their colour comonents
//0 - red
//1 - green
//2 - blue
for(int row=0; row<h; row++)
{
for(int col=0; col<w; col++)
{
jpegPixels[row][col][0] = ((RGBarray[i]>>16)&0xff);
jpegPixels[row][col][1] = ((RGBarray[i]>>8)&0xff);
jpegPixels[row][col][2] = (RGBarray[i]&0xff);
i++;
}
}
//3 arrays - redPixels, greenPixels and bluePixels are assigned from jpegPixels[][][]
//loop again returning back the pixel information using bit shifting
for(int row=0; row<reconstructedJPEG.length; row++)
{
for(int col=0; col<reconstructedJPEG[0].length; col++)
{
int rgb = (redPixels[row][col] & 0xff) << 16 | (greenPixels[row][col] & 0xff) << 8 | (bluePixels[row][col] & 0xff);
bufferedImage.setRGB(col, row, rgb);
}
}
1条答案
按热度按时间kyxcudwk1#
jpg使用有损压缩,因此这种文件格式的像素永远不会精确。如果您查看已复制多次的jpg文件,您将开始看到错误的累积,通常是在图像的边界和边缘。如果您想要完美地存储像素,请使用不同的图像文件格式类型,该格式使用无压缩或无损压缩(如png)。
作为旁白,代码如下:
不应该出现,即使是在“只是一个示例代码来说明…”。
编辑
您声明:
不,我根本没有对像素做任何压缩。出于测试的目的,我只是读入像素,然后用bufferedimage将它们写出来。如中所示,像素值本身被1或2个值稍微改变。我不认识怀伊。从测试和测试,现在似乎与写回文件的值?
您使用的是jpg,所以不管您是否知道,您都在压缩。
再说一遍,你有没有试过用png格式的图片做实验?
编辑2
您声明:
但这并不能解释为什么只有一些像素是不变的,但有一些奇怪的,正在改变。
改变的数量和可能改变的像素数将取决于imagewriter使用的压缩级别(质量级别的倒数)。如果提取出用于jpg图像的实际imagewriter,则可以设置此选项。例如,看看这个问题。