Как читать прорисовываемые биты как InputStream - PullRequest
4 голосов
/ 14 июня 2011

Там говорят какой-то ImageView объект. Я хочу читать биты / необработанные данные этого объекта как InputStream. Как это сделать?

Ответы [ 4 ]

14 голосов
/ 14 июня 2011

Сначала получить фоновое изображение изображения в виде объекта Drawable

iv.getBackground();

Затем преобразуйте Drwable изображение в растровое изображение, используя

BitmapDrawable bitDw = ((BitmapDrawable) d);
        Bitmap bitmap = bitDw.getBitmap();

Теперь используйте ByteArrayOutputStream, чтобы получить растровое изображение в поток и получить bytearray [] преобразовать bytearray в ByteArrayInputStream

Вы можете использовать следующий код для получения входного потока из imageview

Полный исходный код

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);

Спасибо Дипак

4 голосов
/ 15 мая 2012

Эти методы ниже полезны, потому что они работают с любым типом Drawable (не только BitmapDrawable). Если вы хотите использовать кэш для рисования, как в предложении Дэвида Каунта, рассмотрите возможность использования bitmapToInputStream вместо bitmap.compress, потому что он должен быть быстрее.

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());
}
4 голосов
/ 14 июня 2011

Вы можете использовать кэш чертежа для получения растрового представления любого класса View.

view.setDrawingCacheEnabled(true);
Bitmap b = view.getDrawingCache();

Затем вы можете записать растровое изображение в OutputStream, например:

b.compress(CompressFormat.JPEG, 80, new FileOutputStream("/view.jpg"));

В вашем случае, я думаю, вы можете использовать ByteArrayOutputStream , чтобы получить байт [], из которого вы можете создать InputStream. Код будет примерно таким:

ByteArrayOutputStream os = new ByteArrayOutputStream(b.getByteCount());
b.compress(CompressFormat.JPEG, 80, os);
byte[] bytes = os.toByteArray();
0 голосов
/ 14 июня 2011

Возможно, вы ищете это: openRawResource

...