在缓冲图像中获取R,G或B.

时间:2014-09-16 01:00:37

标签: java

我有一个我正在研究的方法。这样做的目的是遍历图像中的每个像素,获取其周围像素的值并创建一个渐变,然后我可以将其与阈值进行比较以确定是否存在边缘。我得到一个错误“无法在原始类型int上调用getBlue()”,我无法弄清楚原因。

int grad = 0;
    for (int i=0; i<img.getWidth(); i++) {
        for (int j=0; j<img.getHeight(); j++) {

            grad += abs(img.getRGB(i+1,j).getBlue()-img.getRGB(i-1,j).getBlue() + abs(img.getRGB(i,j+1).getBlue()-img.getRGB(i,j-1).getBlue());
            grad += abs(img.getRGB(i+1,j).getGreen()-img.getRGB(i-1,j).getGreen()) + abs(img.getRGB(i,j+1).getGreen()-img.getRGB(i,j-1)getGreen());
            grad += abs(img.getRGB(i+1,j).getRed()-img.getRGB(i-1,j).getRed()) + abs(img.getRGB(i,j+1).getRed()-img.getRGB(i,j-1).getRed());

3 个答案:

答案 0 :(得分:3)

getRed(),getGreen()和getBlue()都是Color类的所有方法。在调用方法之前,必须将RGB值封装在Color对象中。例如:

new Color(img.getRGB(i + 1, j)).getBlue();

答案 1 :(得分:0)

您的一个条目是getblue(),其他条目是getBlue()。案件很重要。

你也是从0到宽度或高度的i和j。在边缘处,i-1,i + 1,j-1和j + 1中的至少一个将超出范围。在拐角处,2将超出范围。

答案 2 :(得分:0)

BufferedImage#getRGB返回的RGB值是压缩的int,它不是Color对象。粗略地看一下JavaDocs或IDE自动感知属性会告诉你这个。

您可以使用二进制移位解压缩int值,但我更喜欢使用Color(int, boolean),它会将包RGB值解压缩到Color对象中。

此方法还允许您指定是否应包含alpha频道