Jak przekonwertować tablicę bajtów na mapę bitową


123

Chcę przechowywać obraz w SQLite DataBase. Próbowałem go zapisać za pomocą BLOBiw Stringobu przypadkach przechowuje obraz i może go odzyskać, ale kiedy przekonwertuję go na Bitmapużycie BitmapFactory.decodeByteArray(...), zwracam wartość null.

Użyłem tego kodu, ale zwraca on null

Bitmap  bitmap = BitmapFactory.decodeByteArray(blob, 0, blob.length);

4
Przeczytaj pierwsze 5–10 linków w sekcji „Powiązane” na tej stronie.
Mat

2
Czy zakodowałeś bitmapę przed zapisaniem do bazy danych?
Ronnie

Odpowiedzi:


284

Po prostu spróbuj tego:

Bitmap bitmap = BitmapFactory.decodeFile("/path/images/image.jpg");
ByteArrayOutputStream blob = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0 /* Ignored for PNGs */, blob);
byte[] bitmapdata = blob.toByteArray();

Jeśli bitmapdatajest tablicą bajtów, pobieranie Bitmapodbywa się w następujący sposób:

Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata, 0, bitmapdata.length);

Zwraca zdekodowany Bitmaplub nulljeśli nie można zdekodować obrazu.


2
obraz nie może zostać zdekodowany, jeśli jest w innym formacie, z którego próbujesz zdekodować
lxknvlk

2
Co się stanie, jeśli będę musiał wykonać taką operację wiele razy po kolei? Czy tworzenie nowego obiektu Bitmap za każdym razem nie pochłania zasobów? Czy mogę w jakiś sposób zdekodować moją tablicę do istniejącej mapy bitowej?
Alex Semeniuk

Podaję inną odpowiedź, gdy masz tylko bufor piksela obrazu. Zawsze stawałem się zerowy z powodu braku z, wysokości i koloru w moim buforze. Mam nadzieję, że to pomoże!
Julian

31

Odpowiedź Uttama nie zadziałała dla mnie. Właśnie uzyskałem wartość zerową, gdy:

Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata, 0, bitmapdata.length);

W moim przypadku bitmapdata ma tylko bufor pikseli, więc funkcja decodeByteArray nie może odgadnąć, jakiej szerokości, wysokości i koloru używają bity. Więc spróbowałem tego i zadziałało:

//Create bitmap with width, height, and 4 bytes color (RGBA)    
Bitmap bmp = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
ByteBuffer buffer = ByteBuffer.wrap(bitmapdata);
bmp.copyPixelsFromBuffer(buffer);

Sprawdź https://developer.android.com/reference/android/graphics/Bitmap.Config.html dla różnych opcji kolorów


2
co to jest mBitmaps?
user924
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.