如何在黑莓中实现按位颜色编码

时间:2011-06-01 13:11:41

标签: blackberry-storm

我是blackberry的新手。目前我正在研究位图颜色编码

我为改变图像颜色而实现的代码如下: 位图greyScale = new Bitmap(original.getWidth(),original.getHeight());

    int[] argb = new int[original.getWidth() * original.getHeight()];

    original.getARGB(argb, 0, original.getWidth(), 0, 0, original.getWidth(), original.getHeight());
    for (int i = argb.length - 1; i >= 0; --i)

{             int alpha = argb [i]>> 24;             int red = argb [i]>> 16& 0xFF的;             int green = argb [i]>> 8& 0xFF的;             int blue = 255-argb [i]&为0xFF;

         int  grey = (int) (0.3 * red + 0.59 * green + 0.11 * blue);

        int red2 = red * contrast/10+brightness;
        if (red2>0xFF) red2 = 0xFF;
        if (red2<0) red2 = 0;
        int green2 = green * contrast/10+brightness;
        if (green2>0xFF) green2 = 0xFF;
        if (green2<0) green2 = 0;
        int blue2 = blue * contrast/10+brightness;
        if (blue2>0xFF) blue2 = 0xFF;
        if (blue2<0) blue2 = 0;

        int composite = (alpha << 24) | (red2 << 16) | (green2 << 8) | blue2|red|green;
        argb[i] = composite;
    }

    greyScale.setARGB(argb, 0, original.getWidth(), 0, 0, original.getWidth(), original.getHeight());

    return greyScale;
}

我能够实现这种方法,并且还能够获得各种颜色。 但是,任何人都可以帮助我了解Argb如何处理整个颜色代码。

问候 Pinkesh Gupta

1 个答案:

答案 0 :(得分:0)

谢谢,我正在使用您的代码进行一些修改。要回答你的问题,

argb中的每个字节都是一个32位值,表示0xAARRGGBB格式的一个像素:

  • 8位alpha(透明度):0表示透明,255表示不透明
  • 8位红色
  • 8位绿色
  • 8位蓝色

所以0xFFFFFFFF会是不透明的白色。

提取值的代码如下: 要获得apha值,请将所有内容向右移动24个位置,只留下前8位

int alpha = argb[i] >> 24

要变红,向右移动16,保留前16位。然后使用AND运算符清空前8位。这留下了第二个8位

int red = argb[i] >> 16 & 0xFF

对于绿色,移位8位并清空前16位,留下第3位

int green = argb[i] >> 8 & 0xFF

最后,对于蓝色,只需清空前24位

int blue = argb[i] & 0xFF;

此时,您可以更改alpha,red,green和blue值。我正在使用

int grey = ( red + green + blue ) / 3;
red = grey;
green = grey;
red = grey;

获取位图的灰度版本。

最后,要构成一个新值,将每个部分移动到正确的位置并叠加它们(这恰好与在这种情况下添加它们相同)

int newval = (alpha << 24) | (red << 16) | (green << 8) | blue;

然后设置argb[i] = newval以替换像素。