2010-11-13 6 views
11

Comment interpréter le tableau renvoyé à partir de la méthode de création getPixels pour un bitmap?Explication de la méthode getPixels pour un bitmap dans Android

Voici mon code:

public void foo() { 
    int[] pixels; 
    Bitmap bitmapFoo = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.test2);    
    int height = bitmapFoo.getHeight(); 
    int width = bitmapFoo.getWidth(); 

    pixels = new int[height * width]; 

    bitmapFoo.getPixels(pixels, 0, width, 1, 1, width - 1, height - 1);  
} 

Le tableau « pixels » est renvoyée avec des valeurs de -988602635 à 1.242.635.509 et qui était seulement de quelques couleurs sur un simple fichier PNG j'ai fait. Comment puis-je interpréter les nombres renvoyés par cette méthode?

Editer: Je réalise que cet entier unique représente une couleur. Je ne comprends tout simplement pas comment interpréter cet entier unique dans les valeurs RBG et alpha qui composent la couleur.

Merci.

PS. Si vous vous demandez, "qu'est-ce qu'il essaie de faire?" J'essaie de trouver un moyen de modifier dynamiquement la couleur d'un bitmap.

+0

Vos arguments simples pour getPixels viennent de me sauver ... – Betaminos

Répondre

10

Elle retourne un int pour la Color class.

La classe de couleur définit des méthodes pour créer et convertir ints de couleur. Les couleurs sont représentées sous la forme empaquetées, composée de 4 octets: alpha, rouge, vert, bleu. Les valeurs sont non multipliées, , ce qui signifie que toute transparence est enregistrée uniquement dans le composant alpha, et non dans les composants de couleur. Les composants sont stockés de la manière suivante: (alpha < < 24) | (rouge < < 16) | (vert < < 8) | bleu. Chaque composant s'étend entre 0..255 avec 0 signifiant aucune contribution pour ce composant, et 255 signifiant 100% contribution. Ainsi -noir opaque serait 0xFF000000 (100% opaque mais pas contribue de rouge, Gree, bleu et blanc opaque serait 0xFFFFFFFF

Par exemple, lorsque vous utilisez l'objet Paint:

Paint pRed = new Paint(); 
pRed.setColor(Color.RED); 

setColor attend un int. Color.RED est que la valeur int pour leur sens prédéfini de « rouge ».

+0

Salut merci, mais je sais que c'est une couleur. J'aurais dû mieux formuler ma question, demander ce que je voulais vraiment. C'est mon mauvais et il a été édité. +1 – user432209

+0

@ user432209 voir ma partie citée. (alpha << 24) | (rouge << 16) | (vert << 8) | le bleu est comment les couleurs sont emballées dans l'int. –

+0

C'est la partie que je ne comprends pas. (alpha << 24) | (rouge << 16) | (vert << 8) n'a aucun sens pour moi. – user432209

1

Si vous avez votre alpha, les valeurs rouge, vert et bleu, votre couleur est égale à (alpha < < 24) + (rouge < < 16) + (vert < < 8) + bleu.

Pour récupérer votre alpha, les valeurs rouge, vert et bleu d'un int, dire ARVB:

int alpha=argb>>24; 
int red=(argb-alpha)>>16; 
int green=(argb-(alpha+red))>>8; 
int blue=(argb-(alpha+red+green)); 
5

Encore plus:

int alpha=argb>>24; 
int red=(argb & 0x00FF0000)>>16; 
int green=(argb & 0x0000FF00)>>8; 
int blue=(argb & 0x000000FF); 
14

Vous pouvez effectuer les opérations suivantes pour récupérer les couleurs de un int:

int mColor = 0xffffffff; 

int alpha = Color.alpha(mColor); 
int red = Color.red(mColor); 
int green = Color.green(mColor); 
int blue = Color.blue(mColor); 
0

En outre, je pense qu'il devrait être

bitmapFoo.getPixels(pixels, 0, width, 0, 0, width, height); 

Les coordonnées commencent à 0, n'est-ce pas?

+0

Selon le document pour [getPixels] (http://developer.android.com/reference/android/graphics/Bitmap.html), Stride doit être> = largeur de bitmap. Vous avez utilisé '0' pour la foulée ici. –

+0

Le troisième paramètre est stride, ce qui correspond à la largeur dans l'exemple. La liste des paremètres est la suivante: 'int [] pixels, int offset, int foulée, int x, int y, largeur int, int hauteur' – BVB

Questions connexes