2011-10-08 55 views

回答

82

这可能会实现

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos); 
byte[] bitmapdata = bos.toByteArray(); 
ByteArrayInputStream bs = new ByteArrayInputStream(bitmapdata); 
+2

这不是一个理想的解决方案,因为它会导致位字节在内存的2倍:在的BitmapData和BOS。所以这是浪费记忆。 – Malachiasz

+9

@Malachiasz如果你知道更好的方法,请将其添加为答案,并将其作为评论提及我的答案。未来的人会注意到它。 – blessenm

+0

[This post](https://stackoverflow.com/a/43669060/4515489)报告说EXIF数据在压缩中丢失,所以如果有人想要输入流以便从内存中的位图读取EXIF信息,那么另一个方法将是必要的。 – jk7

3

这是我的方式:

// Your Bitmap. 
Bitmap bitmap = XXX; 

int byteSize = bitmap.getRowBytes() * bitmap.getHeight(); 
ByteBuffer byteBuffer = ByteBuffer.allocate(byteSize); 
bitmap.copyPixelsToBuffer(byteBuffer); 

// Get the byteArray. 
byte[] byteArray = byteBuffer.array(); 

// Get the ByteArrayInputStream. 
ByteArrayInputStream bs = new ByteArrayInputStream(byteArray); 
+0

有关使用getRowBytes()的注意事项,“从KITKAT开始,不应使用此方法计算位图的内存使用量,而应参阅getAllocationByteCount()。” - 从[here](https://developer.android.com/reference/android/graphics/Bitmap.html#getRowBytes()) – jk7

+0

另一方面,getAllocationByteCount()需要API 19。 – jk7