使用setRGB后如何在java中显示灰度图像?
我正在做一些图像处理程序,遇到了显示灰度图像的问题。我所做的是,我使用getRGB提取像素值,然后尝试更改这些像素值。但是在改变了这些像素值之后,我仍然得到了以前缓冲过的相同的图像。我的代码部分如下所示:-使用setRGB后如何在java中显示灰度图像?,java,bufferedimage,grayscale,Java,Bufferedimage,Grayscale,我正在做一些图像处理程序,遇到了显示灰度图像的问题。我所做的是,我使用getRGB提取像素值,然后尝试更改这些像素值。但是在改变了这些像素值之后,我仍然得到了以前缓冲过的相同的图像。我的代码部分如下所示:- int [] rgbArray=new int[width*height]; BufferedImage buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); buffer = ImageIO
int [] rgbArray=new int[width*height];
BufferedImage buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
buffer = ImageIO.read(new File(file));
//Before changing the pixel values
buffer.getRGB(0, 0, width, height, rgbArray , 0,width );
int a = (0xff000000 & rgbArray[0]) >>> 24;
int r = (0x00ff0000 & rgbArray[0]) >> 16;
int g = (0x0000ff00 & rgbArray[0]) >> 8;
int b = (0x000000ff & rgbArray[0]);
System.out.println("a " + a + " r " + r + " g " + g + " b " + b);
System.out.println("rgbArray["+0+"] = "+ rgbArray[0]);
for(int i = 0 ; i<width*height; i++)
{
rgbArray[0]=0x808080; //Changing pixel values to grey
}
buffer.setRGB(0, 0, width, height, rgbArray , 0,width);
//After changing the pixel values
buffer.getRGB(0, 0, width, height, rgbArray , 0,width );
a = (0xff000000 & rgbArray[0]) >>> 24;
r = (0x00ff0000 & rgbArray[0]) >> 16;
g = (0x0000ff00 & rgbArray[0]) >> 8;
b = (0x000000ff & rgbArray[0]);
System.out.println("a " + a + " r " + r + " g " + g + " b " + b);
System.out.println("rgbArray["+0+"] = "+ rgbArray[0]);
int[]rgbArray=newint[width*height];
BuffereImage buffer=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
buffer=ImageIO.read(新文件(File));
//在更改像素值之前
getRGB(0,0,宽度,高度,rgbArray,0,宽度);
int a=(0xff000000&rgbArray[0])>>>24;
int r=(0x00ff0000&rgbArray[0])>>16;
int g=(0x0000ff00&rgbArray[0])>>8;
int b=(0x000000ff&rgbArray[0]);
系统输出打印项次(“a”+a+“r”+r+“g”+g+“b”+b);
System.out.println(“rgbArray[“+0+”]=“+rgbArray[0]);
对于(int i=0;i>>24;
r=(0x00ff0000&rgbArray[0])>>16;
g=(0x0000ff00&rgbArray[0])>>8;
b=(0x000000ff&rgbArray[0]);
系统输出打印项次(“a”+a+“r”+r+“g”+g+“b”+b);
System.out.println(“rgbArray[“+0+”]=“+rgbArray[0]);
像素值的输出对于原始像素和新像素都是正确的,但我无法查看新图像,它显示的是旧图像,即原始图像显示的不是更改后的图像
rgbArray[0]=0x808080; //Changing pixel values to grey
在这里,您只是将第一个像素更改为灰色。您可能想做的是:
rgbArray[i]=0x808080; //Changing pixel values to grey
这会使每个像素变为灰色
//编辑:
当然,每个像素都是完全相同的(灰色),这可以用更少的代码实现,例如:
Graphics2D g2 = buff.createGraphics();
g2.setColor(Color.grey);
g2.fillRect(0, 0, buff.getWidth(), buff.getHeight());
g2.dispose();
如果您想要黑白图片而不是彩色图片,请尝试:
BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
buffer = op.filter(buffer, null);
为了更快地获得更好的帮助,请发布一个。您正在第2行分配一个大的
buffereImage
,但随后将其丢弃并替换为调用ImageIO.read()
。为了内存起见,可能不想这样做。是的,thax…但是我如何将更改后的像素显示为图像?是的,很抱歉,这是rgbArray[i]=0x808080;在原始代码中,我复制了错误的。我得到了正确的像素值,但没有显示正确的图像…@Arizvi这很奇怪。如果我用i替换0,加载一个图像,在其上运行代码,然后保存它,它会被更改(每个像素都设置为灰色)。这就是人们所期望的(所有分配了新值的像素,因此结果应该与原始图像不同…)是的,每个像素都变为灰色,但为什么它没有显示在图像上?我仍然得到旧的彩色图像,但面板上没有新的灰色图像。。。