Android: некоторые проблемы при преобразовании рисованного изображения в байтовый массив - PullRequest
0 голосов
/ 29 сентября 2011

Я хочу преобразовать изображение в моем приложении в строку в кодировке Base64. Это изображение может быть любого типа, например JPEG, PNG и т. Д.

То, что я сделал, я конвертировал в растровое изображение. Затем я преобразовал этот Bitmap в ByteArrayOutputStream с использованием метода сжатия metheod И я преобразовал этот ByteArrayOutputStream в байтовый массив. И затем я кодирую его в Base64 с помощью encodeToString ().

Я могу отобразить изображение, используя вышеуказанный метод, если изображение имеет формат PNG или JPEG.

ByteArrayOutputStream objByteOutput = new ByteArrayOutputStream();
 imgBitmap.compress(CompressFormat.JPEG, 0, objByteOutput);

Но проблема в том, что если изображение относится к какому-либо другому типу, кроме PNG или JPEG, как я могу отобразить изображение?

Или, пожалуйста, предложите мне другой способ получить массив байтов из Bitmap.

Спасибо ...

1 Ответ

1 голос
/ 29 сентября 2011

Я бы предложил использовать

http://developer.android.com/reference/android/graphics/Bitmap.html#copyPixelsToBuffer(java.nio.Buffer)

и укажите ByteBuffer, затем вы можете использовать .array () для ByteBuffer, если он реализован (это необязательный метод), или .get (byte []), чтобы получить его, если .array () не существует.

Обновление:

Чтобы определить размер буфера для создания, вы должны использовать Bitmap.getByteCount (). Однако это присутствует только в API 12 и выше, поэтому вам нужно будет использовать Bitmap.getWidth () * Bitmap.getHeight () * 4 - причина 4 в том, что растровое изображение использует серию пикселей (внутреннее представление может быть меньше но не должно быть больше), каждое из которых представляет собой значение ARGB с 0-255, следовательно, 4 байта на пиксель .

Вы можете получить то же самое с Bitmap.getHeight () * Bitmap.getRowBytes () - вот код, который я использовал, чтобы убедиться, что это сработало:

            BitmapDrawable bmd = (BitmapDrawable) getResources().getDrawable(R.drawable.icon);
            Bitmap bm = bmd.getBitmap();
            ByteBuffer byteBuff = ByteBuffer.allocate(bm.getWidth() * bm.getHeight() * 4);
            byteBuff.rewind();
            bm.copyPixelsToBuffer(byteBuff);
            byte[] tmp = new byte[bm.getWidth() * bm.getHeight() * 4];
            byteBuff.rewind();
            byteBuff.get(tmp);

Это не очень хороший код, но он выводит байтовый массив.

...