0

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

我为更改图像颜色而实现的代码如下: Bitmap grayScale = 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; 诠释红色 = argb[i] >> 16 & 0xFF; 诠释绿色 = argb[i] >> 8 & 0xFF; 诠释蓝色 = 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 如何处理整个颜色代码。

关于平克什·古普塔

4

1 回答 1

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 位,留下第三个 8 位

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替换像素。

于 2012-01-03T13:00:50.337 回答