2011-01-17 17 views
36

Mam moją aplikację, która wyświetla obrazy o różnych proporcjach, skalowane wewnątrz (centerInside) imageView. Potrzebuję stworzyć bitmapę z ImageView, w tym tło (w tym przypadku czarne).Android: jak przekonwertować cały obraz do bitmapy?

Na przykład mam ekran urządzenia 320x480, obraz na pełnym ekranie Wyświetl obraz o rozmiarze do 280x480. Jak mogę uzyskać mapę bitową 320x480?

Na górze tego widoku obrazu mam logo lub przyciski, których nie chcę dołączać do bitmapy, są jak na górnej warstwie. Potrzebuję tylko mapy bitowej z obrazem i czarną obwódką z niektórych stron.

Odpowiedz

88

Można po prostu użyć pamięci podręcznej obrazów obrazu. Wyrenderuje cały widok, tak jak jest on ułożony (przeskalowany, otoczony tłem itp.) Do nowej bitmapy.

tylko upewnij się, że został zbudowany.

imageView.buildDrawingCache(); 
Bitmap bmap = imageView.getDrawingCache(); 

Twoja mapa bitowa jest widoczna na ekranie.

+2

Brzmi nieźle, ale po prostu wyłapuje krytykę dzięki NullPointerException. To dlatego, że obraz nie jest jeszcze zbudowany? – yosh

+5

Ok, wraz z http://stackoverflow.com/questions/2339429/android-view-getdrawingcache-returns-null-only-null rozwiązał mój problem :) Dzięki. – yosh

+4

Dokumentacja stwierdza, że ​​'buildDrawingCache()' powinna być wywołana przez wywołanie 'destroyDrawingCache' (patrz tutaj: http://developer.android.com/reference/android/view/View.html#buildDrawingCache%28boolean%29) –

54

Czy próbowałeś:

BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); 
Bitmap bitmap = drawable.getBitmap(); 
+0

Daje rozmiar obrazu, ale to nie jest problem. Potrzebuję szybkiej metody tworzenia bitmapy wraz z czarną obwódką. Sądzę, że muszę obliczyć orientację i środek obrazu oraz obie czarne ramki, aby dodać je ręcznie do bitmapy utworzonej z obrazu. – yosh

+0

Zdecydowanie najlepsze rozwiązanie, jeśli chcesz uzyskać rzeczywistą zawartość ImageView, a nie tylko widoczne części. –

+0

Należy zauważyć, że imageView.getDrawingCache() otrzyma rzeczywistą reprezentację bitmapy, mapa bitowa zostanie utracona po wyczyszczeniu pamięci podręcznej. – secretlm

4

Tylko głośno myślę tutaj (wprawdzie z małym doświadczeniem w pracy z grafiką w Javie) może coś jak to będzie działać ?:

ImageView iv = (ImageView)findViewById(R.id.imageview); 
Bitmap bitmap = Bitmap.createBitmap(iv.getWidth(), iv.getHeight(), Bitmap.Config.RGB_565); 
Canvas canvas = new Canvas(bitmap); 
iv.draw(canvas); 

Z ciekawości co próbujesz osiągnąć? Może istnieć lepszy sposób na osiągnięcie celu niż to, co masz na myśli.

+1

Potrzebuję pokroić cały ekran i chcę mieć czarne krawędzie, gdy na przykład jest tylko połowa obrazu na kafelku + Chcę mieć obraz wyśrodkowany na ekranie. Canvas przywołuje złe wspomnienia J2ME: D – yosh

+0

Może nie rozumiem ... czy chcesz po prostu wstawić obraz? Możesz zdefiniować bitmapę do rysowania w formacie XML, która będzie się układać automatycznie. Nie rozumiem dokładnie, o co pytasz. – kcoppock

+0

Chcę podzielić obrazy na kwadraty (np. 50 x 50), w tym czarne tło. Obrazy mają różne kolory/proporcje. Myślałem, że szybka droga to tworzenie mapy bitowej z całego ImageView, a nie tylko zawartości obrazu. – yosh

1
try { 
     photo.setImageURI(Uri.parse("Location"); 
     BitmapDrawable drawable = (BitmapDrawable) photo.getDrawable(); 
     Bitmap bitmap = drawable.getBitmap(); 
     bitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true); 
     photo.setImageBitmap(bitmap); 

    } catch (Exception e) { 

    } 
0

Jest to kod roboczych

imageView.setDrawingCacheEnabled(true); 
imageView.buildDrawingCache(); 
Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache()); 
Powiązane problemy