我有一个我正在研究的方法。这样做的目的是遍历图像中的每个像素,获取其周围像素的值并创建一个渐变,然后我可以将其与阈值进行比较以确定是否存在边缘。我得到一个错误“无法在原始类型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());
答案 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
频道