Java BufferedImage 分别获取红色、绿色和蓝色

发布于 2024-08-28 23:11:29 字数 69 浏览 3 评论 0原文

getRGB() 方法返回单个 int。如何分别获取 0 到 255 之间的值的红色、绿色和蓝色?

The getRGB() method returns a single int. How can I get individually the red, green and blue colors all as the values between 0 and 255?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

尹雨沫 2024-09-04 23:11:30

一个像素由 4 字节(32 位)整数表示,如下所示:

00000000 00000000 00000000 11111111
^ Alpha  ^Red     ^Green   ^Blue

因此,要获取各个颜色分量,您只需要一点二进制算术:

int rgb = getRGB(...);
int red = (rgb >> 16) & 0x000000FF;
int green = (rgb >>8 ) & 0x000000FF;
int blue = (rgb) & 0x000000FF;

这确实是 java.awt.Color 类方法执行以下操作:

  553       /**
  554        * Returns the red component in the range 0-255 in the default sRGB
  555        * space.
  556        * @return the red component.
  557        * @see #getRGB
  558        */
  559       public int getRed() {
  560           return (getRGB() >> 16) & 0xFF;
  561       }
  562   
  563       /**
  564        * Returns the green component in the range 0-255 in the default sRGB
  565        * space.
  566        * @return the green component.
  567        * @see #getRGB
  568        */
  569       public int getGreen() {
  570           return (getRGB() >> 8) & 0xFF;
  571       }
  572   
  573       /**
  574        * Returns the blue component in the range 0-255 in the default sRGB
  575        * space.
  576        * @return the blue component.
  577        * @see #getRGB
  578        */
  579       public int getBlue() {
  580           return (getRGB() >> 0) & 0xFF;
  581       }

A pixel is represented by a 4-byte (32 bit) integer, like so:

00000000 00000000 00000000 11111111
^ Alpha  ^Red     ^Green   ^Blue

So, to get the individual color components, you just need a bit of binary arithmetic:

int rgb = getRGB(...);
int red = (rgb >> 16) & 0x000000FF;
int green = (rgb >>8 ) & 0x000000FF;
int blue = (rgb) & 0x000000FF;

This is indeed what the java.awt.Color class methods do:

  553       /**
  554        * Returns the red component in the range 0-255 in the default sRGB
  555        * space.
  556        * @return the red component.
  557        * @see #getRGB
  558        */
  559       public int getRed() {
  560           return (getRGB() >> 16) & 0xFF;
  561       }
  562   
  563       /**
  564        * Returns the green component in the range 0-255 in the default sRGB
  565        * space.
  566        * @return the green component.
  567        * @see #getRGB
  568        */
  569       public int getGreen() {
  570           return (getRGB() >> 8) & 0xFF;
  571       }
  572   
  573       /**
  574        * Returns the blue component in the range 0-255 in the default sRGB
  575        * space.
  576        * @return the blue component.
  577        * @see #getRGB
  578        */
  579       public int getBlue() {
  580           return (getRGB() >> 0) & 0xFF;
  581       }
软的没边 2024-09-04 23:11:30

Java 的 Color 类可以进行转换:

Color c = new Color(image.getRGB());
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();

Java's Color class can do the conversion:

Color c = new Color(image.getRGB());
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
又怨 2024-09-04 23:11:30

您需要一些基本的二进制算术来将其拆分:(

int blue = rgb & 0xFF;
int green = (rgb >> 8) & 0xFF;
int red = (rgb >> 16) & 0xFF;

或者可能反过来,我真的不记得了,并且文档没有给我即时答案)

You'll need some basic binary arithmetic to split it up:

int blue = rgb & 0xFF;
int green = (rgb >> 8) & 0xFF;
int red = (rgb >> 16) & 0xFF;

(Or possibly the other way round, I honestly can't remember and the documentation isn't giving me an instant answer)

月下客 2024-09-04 23:11:30

对于简单的颜色操作,您可以使用

bufImg.getRaster().getPixel(x,y,outputChannels)

outputChannels 是一个用于存储获取的像素的数组。它的长度取决于图像的实际通道数。例如,RGB图像有3个通道; RGBA 图像有 4 个通道。

该方法有 3 种输出类型:int、float 和 double。
要获得 0~255 范围内的颜色值,实际参数 outputChannels 应该是 int[] 数组。

For simple color manipulations, you can use

bufImg.getRaster().getPixel(x,y,outputChannels)

The outputChannels is an array for storing the fetched pixel. Its length depends on your image's actual channel count. For example, an RGB image has 3 channels; and an RGBA image has 4 channels.

This method has 3 output types: int, float and double.
To get a color value ranges from 0~255, your actual parameter outputChannels should be an int[] array.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文