如何创建ARGB_8888像素值?

时间:2011-11-23 17:32:46

标签: java android bitmap pixel

假设我想创建一个像素值数组,以传递给here描述的createBitmap方法。我有三个int值r, g, b,范围是0 - 0xff。如何将它们转换为不透明像素p

alpha通道是进入高字节还是低字节?

我搜索了documentation,但它只说明了:

  

每个像素存储在4个字节上。每个通道(RGB和alpha用于   半透明度以8位精度存储(256种可能   值。)这种配置非常灵活,提供最好的   质量。应尽可能使用它。

那么,如何编写这个方法呢?

int createPixel(int r, int g, int b)
{
  return ?
}

4 个答案:

答案 0 :(得分:11)

看起来RGBA pixel format有很好的文档记录,我假设这是Android文档的意思,只是使用不同的名称来匹配位字段中的通道成员位置:

enter image description here

这样的事情应该有效:

int createPixel(int r, int g, int b) {
  return createPixel(r, g, b, 0xff);
}

int createPixel(int r, int g, int b, int a) {
  return (a<<24) | (r<<16) | (g<<8) | b;
}

此外,您可能希望使用byte而不是int来避免溢出类型错误,或仅屏蔽您想要的位:

int createPixel(int r, int g, int b, int a) {
  return ((a & 0xff) << 24)
       | ((r & 0xff) << 16)
       | ((g & 0xff) << 8)
       | ((b & 0xff));
}

虽然将值限制为[0,255]可能更有意义。

答案 1 :(得分:6)

来自the docs

(alpha << 24) | (red << 16) | (green << 8) | blue

答案 2 :(得分:1)

首先,你的参数应该是字节,而不是整数,但我想这可能是一个实现问题。

一般来说,你会做类似

的事情
return b | r<<8 | g<<16 | 255<<24;

假设您的alpha为255(非透明)。

答案 3 :(得分:1)

这应该有效:

int createPixel(int r, int g, int b)
{
    return 0xff000000 | (r << 16) | (g << 8) | b;
}

或者,如果你想成为巴洛克式的话:

int createPixel(int r, int g, int b)
{
    return (((((-1 << 8) | r) << 8) | g) << 8) | b;
}