2010-12-14 27 views
46

Tôi có hình ảnh từ web trong một số ImageView. Nó rất nhỏ (một favicon) và tôi muốn lưu trữ nó trong cơ sở dữ liệu SQLite của tôi. Tôi có thể nhận được Drawable từ mImageView.getDrawable() nhưng sau đó tôi không biết phải làm gì tiếp theo. Tôi không hiểu đầy đủ về lớp học Drawable trong Android.Có thể chia thành byte []

Tôi biết tôi có thể nhận được một mảng byte từ một Bitmap như:

Bitmap defaultIcon = BitmapFactory.decodeStream(in); 

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

byte[] bitmapdata = stream.toByteArray(); 

Nhưng làm thế nào để tôi nhận được một mảng byte từ một Drawable?

Trả lời

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

Cảm ơn bạn đã rõ ràng !! Không nghĩ đến việc đúc nó. –

+9

Nó phải là: bitmap.compress (Bitmap.CompressFormat.JPEG, 100, stream); Nếu không luồng không chứa dữ liệu ... – Entreco

+0

@Cristian tôi đã lưu bitmapdata trong cơ sở dữ liệu dưới dạng BLOB, một lần nữa khi tôi lấy lại được của mình từ BLOB, nền trở thành màu đen. Bạn có thể giúp tôi không? tôi muốn nền trong suốt như trước khi lưu vào cơ sở dữ liệu. –

-2
File myFile = new File(selectedImagePath); 

byte [] mybytearray = new byte [filelenghth]; 

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

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

nay là hình ảnh được lưu trữ trong bytearray ..

18

Cảm ơn tất cả và điều này giải quyết vấn đề của tôi.

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

tôi đã lưu bitMapData trong cơ sở dữ liệu dưới dạng BLOB, một lần nữa khi tôi lấy lại được từ BLOB, nền trở thành màu đen. Bạn có thể giúp tôi không? tôi muốn nền trong suốt như trước khi lưu vào cơ sở dữ liệu. –

+0

Tôi nghĩ rằng một vấn đề khác của nó xảy ra song song với quá trình đó. Tuyệt vời của nó nếu bạn có thể cung cấp thêm chi tiết để tái sản xuất và kiểm tra. – Randula

+1

nó đã xảy ra khi lưu với định dạng JPEG, nhưng tôi đã thay đổi thành PNG làm việc tốt ... –

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

Điều này dường như là một nhỏ đối với câu trả lời được chấp nhận từ hai năm trước ... – Sam

+0

Đây là một câu trả lời tốt hơn, vì nó không ' t yêu cầu truyền đến BitmapDrawable, mà drawable có thể không thực sự là một thể hiện của. –

+0

@mattsnider Cảm ơn – Kalpesh

0

Nếu drawable là một BitmapDrawable bạn có thể thử thế này.

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

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

Bitmap.getRowBytes() trả về số byte giữa các hàng bằng pixel của ảnh bitmap.

Để tham khảo thêm dự án này: LazyList

+1

Bài đăng này đang được tự động gắn cờ là chất lượng thấp vì đó chỉ là mã. Bạn có muốn mở rộng nó bằng cách thêm một số văn bản để giải thích cách giải quyết vấn đề? – gung

Các vấn đề liên quan