2010-12-14 10 views
46

Mam obraz z internetu w postaci ImageView. Jest bardzo mały (favicon) i chciałbym go przechowywać w mojej bazie danych SQLite. Mogę uzyskać Drawable z mImageView.getDrawable(), ale nie wiem, co dalej. Nie w pełni rozumiem klasę Drawable w systemie Android.Do bajtów []

wiem, że mogę dostać tablicę bajtów na podstawie Bitmap jak:

Bitmap defaultIcon = BitmapFactory.decodeStream(in); 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
defaultIcon.compress(Bitmap.CompressFormat.JPEG, 100, stream); 

byte[] bitmapdata = stream.toByteArray(); 

Ale jak mogę uzyskać tablicę bajtów na podstawie Drawable?

Odpowiedz

110
Drawable d; // the drawable (Captain Obvious, to the rescue!!!) 
Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitmapdata = stream.toByteArray(); 
+0

Dziękuję za oczywistość !! Nie myślał o rzuceniu tego. –

+9

Powinna to być: bitmap.compress (Bitmap.CompressFormat.JPEG, 100, strumień); W przeciwnym razie strumień nie zawiera danych ... – Entreco

+0

@Cristian i zapisałem bitmapdata w bazie danych jako BLOB, ponownie gdy odzyskam mój drawable z BLOBa, tło staje się czarne. Czy możesz mi pomóc? Chcę, aby tło było przezroczyste, tak jak przed zapisaniem w bazie danych. –

-2
File myFile = new File(selectedImagePath); 

byte [] mybytearray = new byte [filelenghth]; 

BufferedInputStream bis1 = new BufferedInputStream(new FileInputStream(myFile)); 

bis1.read(mybytearray,0,mybytearray.length); 

teraz obraz jest zapisany w ByteArray ..

18

Dzięki wszystkim i to rozwiązało mój problem.

Resources res = getResources(); 
Drawable drawable = res.getDrawable(R.drawable.my_pic); 
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitMapData = stream.toByteArray(); 
+0

i zapisałem bitMapData w bazie danych jako BLOB, ponownie gdy odzyskasz mój drawable z BLOBa, tło staje się czarne. Czy możesz mi pomóc? Chcę, aby tło było przezroczyste, tak jak przed zapisaniem w bazie danych. –

+0

Myślę, że jest to inny problem, który występuje równolegle do tego procesu. To wspaniałe, jeśli możesz podać więcej szczegółów do odtworzenia i sprawdzenia. – Randula

+1

działo się to podczas zapisywania w formacie JPEG, ale zmieniłem na PNG działa dobrze ... –

5
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tester); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitMapData = stream.toByteArray(); 
+0

Wygląda na to, że jest nieistotny dla zaakceptowanej odpowiedzi sprzed dwóch lat ... – Sam

+0

To jest lepsza odpowiedź, ponieważ nie " t wymaga rzutowania na BitmapDrawable, którego losowanie może nie być rzeczywistą instancją. –

+0

@mattsnider Dzięki – Kalpesh

0

Jeśli rozciągliwej jest BitmapDrawable można próbować ten jeden.

long getSizeInBytes(Drawable drawable) { 
    if (drawable == null) 
     return 0; 

    Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 
    return bitmap.getRowBytes() * bitmap.getHeight(); 
} 

Bitmap.getRowBytes() zwraca liczbę bajtów w rzędach w pikselach bitmapowego.

Więcej informacji na temat tego projektu: LazyList

+1

Ten wpis jest automatycznie oznaczany jako niskiej jakości, ponieważ jest to tylko kod. Czy możesz rozszerzyć go, dodając tekst wyjaśniający, w jaki sposób rozwiązuje problem? – gung