我是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
答案 0 :(得分:0)
谢谢,我正在使用您的代码进行一些修改。要回答你的问题,
argb中的每个字节都是一个32位值,表示0xAARRGGBB格式的一个像素:
所以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
以替换像素。