it-swarm.com.de

java-Bitmap in ein Byte-Array konvertieren

  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[]

Wenn ich nach dem Aufruf von copyPixelsToBuffer den Puffer ansehe, sind die Bytes alle 0 ... Die von der Kamera zurückgegebene Bitmap ist unveränderlich ... aber das sollte keine Rolle spielen, da eine Kopie erstellt wird. 

Was könnte an diesem Code falsch sein?

249
Tom Fobear

Versuchen Sie etwas so:

Bitmap bmp = intent.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
bmp.recycle();
596
Mezm

CompressFormat ist zu langsam ...

Versuchen Sie ByteBuffer.

※※※ Bitmap zu Byte ※※※

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

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

※※※ Byte zu Bitmap ※※※

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);
41
朱西西

Müssen Sie vielleicht den Puffer zurückspulen?

Dies kann auch passieren, wenn der Schritt (in Byte) der Bitmap größer als die Zeilenlänge in Pixel * Byte/Pixel ist. Machen Sie die Länge der Bytes b.remaining () statt der Größe.

17
Ted Hopp

Verwenden Sie die folgenden Funktionen, um die Bitmap in Byte [] und umgekehrt zu codieren

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

Ihr Byte-Array ist zu klein. Jedes Pixel benötigt 4 Byte, nicht nur 1. Multiplizieren Sie Ihre Größe * 4, damit das Array groß genug ist.

6
MindJuice

Hier ist die Bitmap-Erweiterung .convertToByteArray in Kotlin. 

/**
 * Convert bitmap to byte array using ByteBuffer.
 */
fun Bitmap.convertToByteArray(): ByteArray {
    //minimum number of bytes that can be used to store this bitmap's pixels
    val size = this.byteCount

    //allocate new instances which will hold bitmap
    val buffer = ByteBuffer.allocate(size)
    val bytes = ByteArray(size)

    //copy the bitmap's pixels into the specified buffer
    this.copyPixelsToBuffer(buffer)

    //rewinds buffer (buffer position is set to zero and the mark is discarded)
    buffer.rewind()

    //transfer bytes from buffer into the given destination array
    buffer.get(bytes)

    //return bitmap's pixels
    return bytes
}
6
Tomas Ivan

Ted Hopp ist aus der API-Dokumentation richtig:

public void copyPixelsToBuffer (Buffer dst)

"... Nachdem diese Methode zurückgegeben wurde, wird der aktuelle Position des Puffers aktualisiert: Die Position wird um die Anzahl der in den Puffer geschriebenen Elemente erhöht.

und

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

"Liest Bytes aus dem aktuelle Position in das angegebene Bytearray ab dem angegebenen Offset und erhöht die Position um die Anzahl der gelesenen Bytes."

2
CaptainCrunch

Um OutOfMemory-Fehler bei größeren Dateien zu vermeiden, würde ich die Aufgabe lösen, indem Sie eine Bitmap in mehrere Teile aufteilen und die Bytes ihrer Teile zusammenführen.

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();
}
2
Sa Qada

Versuche dies, um String-Bitmap oder Bitmap-String zu konvertieren

/**
 * @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
Mohammad nabil