2010-10-28 12 views
4

I ont une certaine A bitmap qui je modifie pour produire B. bitmap Je veux produire efficacement un D bitmap par XOR les valeurs de pixels de A et B ensemble de telle sorte que D XOR A produit bitmap B et D XOR B produit bitmap R. Je veux stocker les différences entre les bitmaps afin que je puisse inverser les changements que j'ai faits.Comment XOR les valeurs de pixels de deux bitmaps ensemble?

Jusqu'à présent, j'ai essayé:

  1. Dessin A sur B avec un objet de peinture que je l'ai appelé .setXfermode (nouveau PorterDuffXfermode (PorterDuff.Mode.XOR)) sur. Ceci fonctionne quand l'alpha de A et B est 255 partout mais n'importe quoi au-dessous produit des résultats indésirables. Si je XOR A sur A, par exemple, je m'attendrais à ce que le résultat soit une image vide. Avec ce mode xfer, la plus grande partie de A disparaîtra mais les parties sans alpha complet resteront.

  2. Dessin A sur B avec un objet de dessin que j'ai appelé .setXfermode (nouveau PixelXorXfermode (0)). Ce mode xfer détruit les valeurs alpha, ce qui n'est pas ce que je veux. Je ne suis pas sûr non plus des choses utiles pour lesquelles je peux définir la valeur du constructeur.

Que puis-je faire? J'ai besoin de quelque chose qui traitera les valeurs de pixels comme des valeurs simples et ne traitera pas les valeurs alpha comme un cas particulier. J'ai besoin que ce soit assez rapide (comme le sont les types de peinture ci-dessus) et utiliser quelque chose comme setpixel/getpixel ou faire les calculs moi-même dans un byte [] sera beaucoup trop lent.

Edit: Quelqu'un peut-il aider? Même en sachant que la plupart des gens ne croient pas qu'il y a un appel API qui fera cela pour moi aidera. Je suis presque assez désespéré pour passer au rendu OpenGL car il a un mode de rendu XOR (qui, je l'espère, n'a pas le même problème ci-dessus).

Répondre

0

Est-il possible d'essayer XOR des tableaux d'octets des bitmaps avant de tirer? Cela ne fournirait pas de traitement spécial aux alphas, et pourrait en théorie fonctionner si les bitmaps sont de taille identique. Il ne peut pas être rapide, bien sûr ...

Ou peut-être vous pouvez utiliser l'une des méthodes ci-dessus, mais en quelque sorte manipuler les valeurs alpha des tableaux d'octets et gérer séparément?

+0

XOR deux 400x800 bitmaps sur un Droid (sans JIT) prend environ 0,3s ce qui est beaucoup trop lent. Je vais probablement devoir faire cela en utilisant le NDK. – RichardNewton

0

en variante, envisager de copier l'image originale dans une mémoire tampon. pour annuler, il suffit de copier l'image enregistrée sur l'image modifiée. il ne devrait pas prendre plus de mémoire et évite le problème XOR.

+0

Le problème avec ceci est que vous n'avez pas assez d'informations pour refaire l'opération (sans avoir à recalculer les changements qui peuvent être lents) et l'image XORed est beaucoup plus facile à compresser dans de nombreuses situations. – RichardNewton