【问题标题】:Java BufferedImage getRGB method and Color classJava BufferedImage getRGB 方法和 Color 类
【发布时间】:2012-11-11 03:33:05
【问题描述】:

getRGB(x, y) 方法中的 x 和 y 参数代表什么?数值返回值代表什么?

如何识别绘图面板上显示的 BufferedImage 中特定像素的颜色?理想情况下,我想在图像中“找到”一个单词,并在该单词下划线或勾勒出轮廓以创建相关的超链接。如何将这些数值转换为人类可以理解的颜色,如“红色”、“绿色”或“蓝色”?

是的,我知道在 Color 类中,0-255 的 alpha 值表示从透明到不透明。但这对实际颜色意味着什么?我很高兴澄清这是否没有意义。感谢您的阅读。

【问题讨论】:

    标签: java image-processing colors


    【解决方案1】:

    x 和 y 坐标代表像素位置,x 从左到右,y 从上到下(均从 0 开始)。所以 (0, 0) 是左上像素, (width-1, height-1) 是右下像素。

    返回的整数值将 R、G、B 和(可能)Alpha 值打包到单个 int 中。请记住,一个 int 包含 32 位,因此其中 8 位分配给每个值。

    但是,如果您不擅长在整数内移动位,最简单的方法是将整数值传递给 Color 的构造函数

    int rgba = image.getRGB(coordinates);
    Color col = new Color(rgba, true);
    int r = col.getRed();
    int g = col.getGreen();
    ...
    

    显然,从原始像素值中识别单词的位置是另一个非常复杂的问题。

    【讨论】:

    • 感谢您的回复。如果您不介意的话,还有几个后续问题:我已经实现了类似的东西,但是当我将 x 和 y 指定为高于 84 的任何值时,我得到了“坐标越界”错误。但是我的 DrawingPanel 是使用参数 500、500 建立的,所以它们不应该在这些范围内吗?另外,在 32 位表示中,你能告诉我每个 8 位值转换成什么吗?即,如果我的值为 0000001,那是多少红色?它只是随着价值的增加而增加吗?再次感谢。
    • 你知道的,还知道如何将数字转换成颜色。如果您仍然有洞察力,那就太好了,但我自己已经取得了一些进展。
    • 好吧,如果您想“手动”提取颜色分量,您基本上会向右移动 8 的倍数,然后与 255 (0xff) 进行与运算。所以 (rgba & 0xff), (rgba >>> 8) & 0xff, (rgba >>> 16) & 0xff, (rgba >>> 24) & 0xff 会给你单独的组件。但是,如果您对此不太熟悉,正如我所说,您不妨通过 Color wrapper。
    • 嗨@NeilCoffey 有没有办法获得指定区域的平均 rgb 值.. 就像获取位图的平均 rgb 值长度一样.. 我想将图像纵向分成大约 100 块并获得每个切片的平均 rgb ......请帮助。 (我赞成你的回答:))
    • @aav 对于许多应用程序,我认为您真的可以按照您的预期计算它:将相关的 R、G 和 B 值相加为 3 个变量,然后将每个变量除以采样到的像素数得到 (R, G, B) 的平均颜色。如果每个“波段”都涉及大量像素并且速度是一个问题,您可以从给定波段中取一个随机样本的平均值,例如 100 个像素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多