Преобразование растрового изображения Java в байтовый массив

  Bitmap bmp   = intent.getExtras().get("data");
  int size     = bmp.getRowBytes() * bmp.getHeight();
  ByteBuffer b = ByteBuffer.allocate(size);

  bmp.copyPixelsToBuffer(b);

  byte[] bytes = new byte[size];

  try {
     b.get(bytes, 0, bytes.length);
  } catch (BufferUnderflowException e) {
     // always happens
  }
  // do something with byte[]

Когда я смотрю на буфер после вызова copyPixelsToBuffer, все байты 0... Растровое изображение, возвращаемое с камеры, является неизменным... но это не имеет значения, так как он делает копию.

Что может быть неправильным с этим кодом?

+214
14 февр. '11 в 5:42
источник поделиться
9 ответов

Попробуйте что-то вроде этого:

Bitmap bmp = intent.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
+519
14 февр. '11 в 6:49
источник

Связанные вопросы


Похожие вопросы

Использовать CompressFormat слишком медленно...

Попробуйте использовать ByteBuffer.

※※※ Растровое изображение в байт ※※※

            width = bitmap.getWidth();
            height = bitmap.getHeight();

            int size = bitmap.getRowBytes() * bitmap.getHeight();
            ByteBuffer byteBuffer = ByteBuffer.allocate(size);
            bitmap.copyPixelsToBuffer(byteBuffer);
            byteArray = byteBuffer.array();

※※※ байт в растровое изображение ※※※

        Bitmap.Config configBmp = Bitmap.Config.valueOf(bitmap.getConfig().name());
        Bitmap bitmap_tmp = Bitmap.createBitmap(width, height, configBmp);
        ByteBuffer buffer = ByteBuffer.wrap(byteArray);
        bitmap_tmp.copyPixelsFromBuffer(buffer);
+19
08 дек. '15 в 20:34
источник

Вам нужно перемотать буфер, возможно?

Кроме того, это может произойти, если шаг (в байтах) растрового изображения больше длины строки в пикселях * байт/пиксель. Сделайте длину байтов b.remaining() вместо размера.

+16
14 февр. '11 в 5:56
источник

Ваш массив байтов слишком мал. Каждый пиксель занимает 4 байта, а не только 1, поэтому умножьте свой размер * 4 так, чтобы массив был достаточно большим.

+5
23 мар. '12 в 1:05
источник

Используйте ниже функции для кодирования растрового изображения в байт [] и наоборот

public static String encodeTobase64(Bitmap image) {
            Bitmap immagex = image;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            immagex.compress(Bitmap.CompressFormat.PNG, 90, baos);
            byte[] b = baos.toByteArray();
            String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
            return imageEncoded;
        }

 public static Bitmap decodeBase64(String input) {
    byte[] decodedByte = Base64.decode(input, 0);
    return BitmapFactory.decodeByteArray(decodedByte, 0,      decodedByte.length);
 }
+3
22 апр. '16 в 10:28
источник

Ted Hopp корректен из документации API:

public void copyPixelsToBuffer (Buffer dst)

"... После возвращения этого метода текущая позиция буфера обновляется: позиция увеличивается на количество элементов, записанных в буфере."

и

public ByteBuffer get (byte[] dst, int dstOffset, int byteCount)

"Считывает байты из текущей позиции в указанный массив байтов, начиная с указанного смещения и увеличивая позицию по количеству прочитанных байтов."

+1
19 февр. '16 в 14:11
источник

Чтобы избежать ошибки OutOfMemory для больших файлов, я бы решил задачу, разделив растровое изображение на несколько частей и объединив байты своих частей.

private byte[] getBitmapBytes(Bitmap bitmap)
{
    int chunkNumbers = 10;
    int bitmapSize = bitmap.getRowBytes() * bitmap.getHeight();
    byte[] imageBytes = new byte[bitmapSize];
    int rows, cols;
    int chunkHeight, chunkWidth;
    rows = cols = (int) Math.sqrt(chunkNumbers);
    chunkHeight = bitmap.getHeight() / rows;
    chunkWidth = bitmap.getWidth() / cols;

    int yCoord = 0;
    int bitmapsSizes = 0;

    for (int x = 0; x < rows; x++)
    {
        int xCoord = 0;
        for (int y = 0; y < cols; y++)
        {
            Bitmap bitmapChunk = Bitmap.createBitmap(bitmap, xCoord, yCoord, chunkWidth, chunkHeight);
            byte[] bitmapArray = getBytesFromBitmapChunk(bitmapChunk);
            System.arraycopy(bitmapArray, 0, imageBytes, bitmapsSizes, bitmapArray.length);
            bitmapsSizes = bitmapsSizes + bitmapArray.length;
            xCoord += chunkWidth;

            bitmapChunk.recycle();
            bitmapChunk = null;
        }
        yCoord += chunkHeight;
    }

    return imageBytes;
}


private byte[] getBytesFromBitmapChunk(Bitmap bitmap)
{
    int bitmapSize = bitmap.getRowBytes() * bitmap.getHeight();
    ByteBuffer byteBuffer = ByteBuffer.allocate(bitmapSize);
    bitmap.copyPixelsToBuffer(byteBuffer);
    byteBuffer.rewind();
    return byteBuffer.array();
}
+1
07 нояб. '16 в 17:23
источник

Простой способ:

private byte[] bitmapToByte(Bitmap bitmap){
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    return byteArray;
}

Вызвать это, чтобы получить массив byte [] растрового изображения:

bitmapToByte(yourBitmap)
0
10 мая '17 в 13:45
источник

Попробуйте это преобразовать String-Bitmap или Bitmap-String

/**
 * @param bitmap
 * @return converting bitmap and return a string
 */
public static String BitMapToString(Bitmap bitmap){
    ByteArrayOutputStream baos=new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG,100, baos);
    byte [] b=baos.toByteArray();
    String temp=Base64.encodeToString(b, Base64.DEFAULT);
    return temp;
}

/**
 * @param encodedString
 * @return bitmap (from given string)
 */
public static Bitmap StringToBitMap(String encodedString){
    try{
        byte [] encodeByte=Base64.decode(encodedString,Base64.DEFAULT);
        Bitmap bitmap= BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
        return bitmap;
    }catch(Exception e){
        e.getMessage();
        return null;
    }
}
0
03 мая '17 в 5:29
источник

Посмотрите другие вопросы по меткам или Задайте вопрос