There's say some ImageView
object. I want to read bits/raw data of this object as InputStream. How to do that?

- 16,638
- 18
- 73
- 146
-
1See http://stackoverflow.com/a/36062748/241986 – Boris Treukhov Aug 20 '16 at 13:18
4 Answers
First get background image of the ImageView
as an object of Drawable
:
iv.getBackground();
Then convert Drawable
image into Bitmap
using
BitmapDrawable bitDw = ((BitmapDrawable) d);
Bitmap bitmap = bitDw.getBitmap();
Now use ByteArrayOutputStream
to get the Bitmap
into a Stream
and get bytearray[]
; then
convert the bytearray
into a ByteArrayInputStream
.
You can use the following code to get InputStream
from ImageView
.
Full Source code
ImageView iv = (ImageView) findViewById(R.id.splashImageView);
Drawable d = iv.getBackground();
BitmapDrawable bitDw = ((BitmapDrawable) d);
Bitmap bitmap = bitDw.getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] imageInByte = stream.toByteArray();
System.out.println("........length......" + imageInByte);
ByteArrayInputStream bis = new ByteArrayInputStream(imageInByte);
Thanks Deepak

- 2,793
- 7
- 34
- 62

- 53,011
- 55
- 178
- 243
These methods below are useful because they work with any kind of Drawable (not only BitmapDrawable). If you want to use drawing cache as in David Caunt's suggestion, consider using bitmapToInputStream
instead of bitmap.compress
, because it should be faster.
public static Bitmap drawableToBitmap (Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable)drawable).getBitmap();
}
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
public static InputStream bitmapToInputStream(Bitmap bitmap) {
int size = bitmap.getHeight() * bitmap.getRowBytes();
ByteBuffer buffer = ByteBuffer.allocate(size);
bitmap.copyPixelsToBuffer(buffer);
return new ByteArrayInputStream(buffer.array());
}

- 12,497
- 6
- 42
- 44
-
It does not re-compress the image, but why I must allocate bitmap pixels, it double the memory occupied! – Perry Mar 10 '20 at 10:41
You can use the drawing cache to retrieve a Bitmap representation of any View class.
view.setDrawingCacheEnabled(true);
Bitmap b = view.getDrawingCache();
Then you can write the bitmap to an OutputStream, for example:
b.compress(CompressFormat.JPEG, 80, new FileOutputStream("/view.jpg"));
In your case I think you can use a ByteArrayOutputStream to get a byte[] from which you can create an InputStream. The code would be something like this:
ByteArrayOutputStream os = new ByteArrayOutputStream(b.getByteCount());
b.compress(CompressFormat.JPEG, 80, os);
byte[] bytes = os.toByteArray();

- 57,804
- 13
- 114
- 132
-
in the question Barmaley has mentioned that the question is meant for imageview – Sunil Kumar Sahoo Jun 14 '11 at 12:19
-
An ImageView displays an image. To capture any view's rendering, including ImageView, the above code will do the job. – David Snabel-Caunt Jun 14 '11 at 12:44
You might be looking for this: openRawResource

- 11,436
- 2
- 31
- 37
-
I didn't say about image stored in resource. I was talking about ImageView object inflated on screen (so the source is unknown) – Barmaley Jun 14 '11 at 10:48