2010-11-13 9 views
11

Jak interpretować zwróconą tablicę z użyciem metody getPixels dla mapy bitowej?Wyjaśnienie metody getPixels dla mapy bitowej w systemie Android:

Oto mój kod:

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);  
} 

The „piksele” tablicy zostanie zwrócony z wartościami z -988,602,635 do 1,242,635,509 i to właśnie od kilku kolorach na prostym pliku PNG zrobiłem. Jak interpretować liczby, które zostaną zwrócone z tej metody?

Edycja: Zdaję sobie sprawę, że ta jedna liczba całkowita reprezentuje kolor. Po prostu nie rozumiem, jak interpretować tę jedną liczbę całkowitą w wartościach RBG i alfa, które składają się na kolor.

Dzięki.

PS. Jeśli pytasz siebie, "co on próbuje zrobić?" Próbuję znaleźć sposób na dynamiczną modyfikację koloru bitmapy.

+0

Twoje proste argumenty za getPixels właśnie mnie uratowały ... – Betaminos

Odpowiedz

10

Zwraca int do Color class.

Klasa Kolor określa sposoby tworzenia i konwersja kolorów ints. Kolory są reprezentowane jako zapakowane jako, złożone z 4 bajtów: alfa, czerwony, zielony, niebieski. Wartości są nieproporcjonalne, , co oznacza, że ​​każda przezroczystość jest przechowywana wyłącznie w składniku alfa, a nie w składnikach kolorów. Składniki są przechowywane w następujący sposób: (alpha < < 24) | (czerwony < < 16) | (zielony < < 8) | niebieski. Każdy komponent obejmuje zakres od 0,2555 do 0, co oznacza brak wkładu dla tego komponentu, oraz 255, co oznacza 100% wkładu. Zatem nieprzezroczysty czarny byłoby 0xFF000000 (100% nieprzezroczysty, ale nie przyczynia się z czerwonym, gree, niebieski i nieprzezroczystego-Białej będzie 0xFFFFFFFF

Na przykład, podczas korzystania z obiektu malowania:

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

setColor oczekuje int. Color.RED jest to, że ich wartość int zdefiniowanym znaczeniu „czerwony”.

+0

Hej dzięki, ale wiem, że to jest kolor. Powinienem był lepiej sformułować moje pytanie, zapytać, co naprawdę chciałem. To jest moje złe i zostało zmienione. +1. – user432209

+0

@ user432209 zobacz moją cytowaną część. (alfa << 24) | (czerwony << 16) | (zielony << 8) | niebieski jest jak kolory są pakowane do int. –

+0

To jest część, której nie otrzymuję. (alfa << 24) | (czerwony << 16) | (zielony << 8) nie ma dla mnie sensu. – user432209

1

Jeśli masz alfa, czerwony, zielony i niebieski wartości, twój kolor jest równa do (alpha < < 24) + (czerwony < < 16) + (zielony < < 8) + niebieski.

Aby odzyskać swoją alfa, czerwony, zielony i niebieski wartości z int, powiedzieć aRGB:

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

Nawet więcej:

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

Można także wykonać następujące czynności, aby pobrać kolory z 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

Poza tym, myślę, że powinno być

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

Współrzędne rozpoczynają się od 0, prawda?

+0

Zgodnie z dokumentem dla [getPixels] (http://developer.android.com/reference/android/graphics/Bitmap.html), Stride musi być> = szerokość bitmapy. Użyłeś tutaj "0" do kroku. –

+0

Trzeci parametr to krok, który w powyższym przykładzie jest równy szerokości. Lista paremeterów jest następująca: 'int [] pikseli, int offset, int kroku, int x, int y, int width, int height' – BVB

Powiązane problemy