4

我通过 JNI 调用 C++ 函数并传递一个 RGBA_8888 位图,锁定它,更改值,解锁它,返回,然后使用以下 C++ 代码在 Java 中显示它:

AndroidBitmap_getInfo(env, map, &info) < 0);
AndroidBitmap_lockPixels(env, map, (void**)&pixel);

for(i=info.width*info.height-1;i>=0;i--)
{   pixel[i] = 0xf1f1f1f1;
}

AndroidBitmap_unlockPixels(env, map);

我遇到的问题是位图看起来不像我预期的那样,当我在 Java 中检查它们时,像素值(使用 getPixel 验证)与我在 C++ 中设置的不同。当我将位图值设置为 0xffffffff 时,我在 Java 中得到了正确的值,但对于其他许多我没有。例如 0xf1f1f1f1 变成 0xF1FFFFFF。

我该怎么做才能让它工作?

PS:我使用的是安卓 2.3.4

4

1 回答 1

3

看来问题是由于预乘的阿尔法。

进一步的测试表明 r,g,b 值被 alpha 缩放,所以如果我将位图传递给 jni,我需要将 r,g,b 值乘以 255,然后除以 alpha 以获得我的真实值可以做阿尔法操作。当我把它们传回去时,我必须做相反的事情。

仅用于不需要 alpha 的复制和操作,因为 alpha 将是 255 以获得最大不透明度,而 * 255 / 255 会自行否定。

于 2012-06-10T00:04:38.870 回答