我正在开发一个有关图像处理的项目,在该项目中,我必须填充破裂绘画的数字化图像。我必须将彩色图像转换为灰度图像,对灰度图像的2D数组执行一些计算,然后将其写回灰度图像。此代码是:
BufferedImage colorImage=ImageIO.read(new File(strImagePath)); BufferedImage image = new BufferedImage(colorImage.getWidth(),colorImage.getHeight(),BufferedImage.TYPE_BYTE_GRAY); Graphics g = image.getGraphics(); g.drawImage(colorImage, 0, 0, null); g.dispose(); ImageIO.write(image,"PNG",new File("Image.PNG")); BufferedImage imgOriginal=ImageIO.read(new File("Image.PNG")); int width=image.getWidth(); int height=image.getHeight(); BufferedImage im=new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY); int arrOriginal[][]=new int[height][width]; for(int i=0;i<height;i++) for(int j=0;j<width;j++) arrOriginal[i][j]=imgOriginal.getRGB(j,i)& 0xFF; for(int i=0;i<height;i++) for(int j=0;j<width;j++) im.setRGB(j,i,arrOriginal[i][j]); ImageIO.write(im,"PNG",new File("Image1.PNG"));
但是输出的图像要暗得多,我没有找回原始图像(我还没有做任何更改)。
我认为setRGB()语句中应该有一些更改,但我不知道是什么。
为了写回图像,我也尝试过:
`
BufferedImage im = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY); WritableRaster raster = im.getRaster(); for(int i=0;i<height;i++) for(int j=0;j<width;j++) raster.setSample(j,i,0,arrOriginal[i][j]);
但这也不会给我原始图像。
谁能提供我这个问题的解决方案?提前致谢。
我对基于Java的图像处理一无所知,但是总体上我对图像处理了解很多,所以我将看看是否能给您提供任何想法。如果我错了,请不要射击我-我只是在提出一个主意。
在灰度图像中,红色,绿色和蓝色值都相同,即Red = Green = Blue。因此,当您调用getRGB并使用0xff进行AND运算时,您可能只会得到蓝色分量,但这没关系,因为红色和绿色是相同的-因为它是灰度的。
我怀疑问题在于,当您将其写回以创建新的输出图像时,您仅设置了蓝色组件,而不是设置了红色和绿色-它们应该仍然相同。尝试写回
original pixel + (original pixel << 8 ) + (original pixel <<16)
这样您不仅可以设置蓝色,还可以设置红色和绿色。