我正在尝试从RGB转换为GrayScale图像。
执行此任务的方法如下:
public BufferedImage rgbToGrayscale(BufferedImage in)
{
int width = in.getWidth();
int height = in.getHeight();
BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster = grayImage.getRaster();
int [] rgbArray = new int[width * height];
in.getRGB(0, 0, width, height, rgbArray, 0, width);
int [] outputArray = new int[width * height];
int red, green, blue, gray;
for(int i = 0; i < (height * width); i++)
{
red = (rgbArray[i] >> 16) & 0xff;
green = (rgbArray[i] >> 8) & 0xff;
blue = (rgbArray[i]) & 0xff;
gray = (int)( (0.30 * red) + (0.59 * green) + (0.11 * blue));
if(gray < 0)
gray = 0;
if(gray > 255)
gray = 255;
outputArray[i] = (gray & 0xff);
}
}
raster.setPixels(0, 0, width, height, outputArray);
return grayImage;
}
我有一个将像素值保存在文件中的方法:
public void writeImageValueToFile(BufferedImage in, String fileName)
{
int width = in.getWidth();
int height = in.getHeight();
try
{
FileWriter fstream = new FileWriter(fileName + ".txt");
BufferedWriter out = new BufferedWriter(fstream);
int [] grayArray = new int[width * height];
in.getRGB(0, 0, width, height, grayArray, 0, width);
for(int i = 0; i < (height * width); i++)
{
out.write((grayArray[i] & 0xff) + "\n");
}
out.close();
} catch (Exception e)
{
System.err.println("Error: " + e.getMessage());
}
}
我遇到的问题是,我从我的方法得到的RGB值总是大于预期值。
我创建了一个图像并用颜色128,128,128填充它。根据第一种方法,如果我打印outputArray的数据,我得到:
r,g,b = 128,128,128。最终= 127 ---&gt;纠正:D
但是,当我调用第二种方法时,我得到的RGB值187不正确。
有什么建议吗?
感谢!!!
答案 0 :(得分:1)
看看javax.swing.GrayFilter
,它使用RBGImageFilter
类来完成同样的事情并且具有非常相似的实现。它可能会让你的生活更简单。
答案 1 :(得分:0)
我不是这些东西的专家,但是RGB值是否存储为hex(base16)?如果是这样,问题在于您假设操作& 0xff
将导致您的int
作为base16存储/处理。它只是一种表示法,字符串中的默认int
用法始终为base10。
int a = 200;
a = a & 0xff;
System.out.println(a);
// output
200
您需要使用显式的base16 toString()方法。
System.out.println(Integer.toHexString(200));
// output
c8