2012-06-09 1 views
4

J'appelle une fonction C++ sur JNI et passer un bitmap RGBA_8888, verrouiller, modifier les valeurs, le déverrouiller, revenir puis l'afficher en Java avec ce code C++:Comment puis-je modifier un bitmap Android dans le NDK pour que je puisse l'utiliser du côté 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); 

Le problème que j'ai est que les bitmaps ne ressemblent pas à ce que je m'attends et les valeurs de pixels (vérifiées avec getPixel) ne sont pas les mêmes quand je les vérifie en Java à partir de ce que je leur ai donné en C++. Quand je place les valeurs de bitmap à 0xffffffff j'obtiens la valeur correcte dans Java, mais pour beaucoup d'autres je ne fais pas. 0xf1f1f1f1 devient par exemple 0xF1FFFFFF.

Que dois-je faire pour le faire fonctionner?

PS: J'utilise Android 2.3.4

Répondre

3

Il semble que le problème est dû au fait de l'prémultipliée alpha. D'autres tests ont révélé que les valeurs r, g, b sont mises à l'échelle par l'alpha, donc si je passe un bitmap à jni, je dois multiplier les valeurs r, g, b par 255 et les diviser par l'alpha pour avoir valeur réelle que je peux faire des opérations alpha avec. Quand je les repasse, je dois faire l'inverse.

Pour la copie et les opérations sans alpha inutiles, car l'alpha sera 255 pour une opacité maximale et * 255/255 sera éliminé.

Questions connexes