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…从相机返回的位图是不可变的…但这不重要,因为它正在复制。

这段代码可能有什么问题?


当前回答

您的字节数组太小。每个像素占用4个字节,而不是1个字节,所以将你的大小乘以4,这样数组就足够大了。

其他回答

压缩格式太慢…

ByteBuffer试试。

※※※位图到字节※※※

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

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

※※※真佩服to 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);

您的字节数组太小。每个像素占用4个字节,而不是1个字节,所以将你的大小乘以4,这样数组就足够大了。

也许你需要倒带缓冲器?

同样,如果位图的步幅(以字节为单位)大于行长(以像素*字节/像素为单位),也可能发生这种情况。使字节的长度为b.remaining()而不是size。

尝试转换字符串-位图或位图-字符串

/**
 * @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;
    }
}

Ted Hopp是正确的,摘自API文档:

public void copyPixelsToBuffer (Buffer dst)

“…该方法返回后,缓冲区的当前位置将被更新:位置将按写入缓冲区的元素数量递增。 "

and

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

从指定的偏移量开始,将字节从当前位置读入指定的字节数组,并将位置增加所读的字节数。