将未压缩的位图转换为字节数组
convert to and from uncompressed bitmap to byte array
我正在尝试实现两种方法。
将 ImageView 作为输入并输出未压缩的字节数组。
第二个采用字节数组输入并转换为位图。
这是我使用的两种方法,但是 bytesToImage() 无法生成 imageToBytes 输出的有效位图表示:
private static byte[] imageToBytes(ImageView iv) {
byte[] imageInByte = null;
Bitmap originalImage;
BitmapDrawable drawable = (BitmapDrawable) iv.getDrawable();
originalImage = drawable.getBitmap();
int numOfbytes = originalImage.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(numOfbytes);
originalImage.copyPixelsToBuffer(buffer);
imageInByte = buffer.array();
return imageInByte;
}
private static Bitmap bytesToImage(byte data[]) {
ByteBuffer byte_buffer = ByteBuffer.wrap(data);
byte_buffer.rewind();
Bitmap bmp = Bitmap.createBitmap(60, 60, Bitmap.Config.ARGB_8888);
bmp.copyPixelsFromBuffer(byte_buffer);
return bmp;
}
然后按以下方式调用这些方法:
ImageView iv = (ImageView) findViewById(R.id.imageViewInput);
iv.setImageResource(R.drawable.panda);
imageInBytes = imageToBytes(iv);
Bitmap bmp = bytesToImage(imageInBytes);
ImageView image = (ImageView) findViewById(R.id.imageViewOutput);
image.setImageBitmap(bmp);
但是 imageViewOutput 只显示一个空的白框。
熊猫图片是.bmp图片
在您的 imageToBytes 方法上试试这个
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
在你的 bytesToImage 上
BitmapFactory.decodeByteArray(bitmapdata , 0, bitmapdata .length);
所以问题出在 bytesToImage 中的位图配置不正确。
这需要直接传入原始位图
这是更新后的 bytesToImage 方法,它给出了正确答案。
private static Bitmap bytesToImage(byte data[], Bitmap originalImage) {
Bitmap newBmp;
newBmp = Bitmap.createBitmap(originalImage.getWidth(), originalImage.getHeight(), originalImage.getConfig());
ByteBuffer buffer1 = ByteBuffer.wrap(data);
buffer1.rewind();
newBmp.copyPixelsFromBuffer(buffer1);
byte[] imageInByte = null;
ByteBuffer byte_buffer = ByteBuffer.wrap(data);
byte_buffer.rewind();
newBmp.copyPixelsFromBuffer(byte_buffer);
return newBmp;
}
我正在尝试实现两种方法。
将 ImageView 作为输入并输出未压缩的字节数组。
第二个采用字节数组输入并转换为位图。
这是我使用的两种方法,但是 bytesToImage() 无法生成 imageToBytes 输出的有效位图表示:
private static byte[] imageToBytes(ImageView iv) {
byte[] imageInByte = null;
Bitmap originalImage;
BitmapDrawable drawable = (BitmapDrawable) iv.getDrawable();
originalImage = drawable.getBitmap();
int numOfbytes = originalImage.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(numOfbytes);
originalImage.copyPixelsToBuffer(buffer);
imageInByte = buffer.array();
return imageInByte;
}
private static Bitmap bytesToImage(byte data[]) {
ByteBuffer byte_buffer = ByteBuffer.wrap(data);
byte_buffer.rewind();
Bitmap bmp = Bitmap.createBitmap(60, 60, Bitmap.Config.ARGB_8888);
bmp.copyPixelsFromBuffer(byte_buffer);
return bmp;
}
然后按以下方式调用这些方法:
ImageView iv = (ImageView) findViewById(R.id.imageViewInput);
iv.setImageResource(R.drawable.panda);
imageInBytes = imageToBytes(iv);
Bitmap bmp = bytesToImage(imageInBytes);
ImageView image = (ImageView) findViewById(R.id.imageViewOutput);
image.setImageBitmap(bmp);
但是 imageViewOutput 只显示一个空的白框。
熊猫图片是.bmp图片
在您的 imageToBytes 方法上试试这个
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
在你的 bytesToImage 上
BitmapFactory.decodeByteArray(bitmapdata , 0, bitmapdata .length);
所以问题出在 bytesToImage 中的位图配置不正确。
这需要直接传入原始位图
这是更新后的 bytesToImage 方法,它给出了正确答案。
private static Bitmap bytesToImage(byte data[], Bitmap originalImage) {
Bitmap newBmp;
newBmp = Bitmap.createBitmap(originalImage.getWidth(), originalImage.getHeight(), originalImage.getConfig());
ByteBuffer buffer1 = ByteBuffer.wrap(data);
buffer1.rewind();
newBmp.copyPixelsFromBuffer(buffer1);
byte[] imageInByte = null;
ByteBuffer byte_buffer = ByteBuffer.wrap(data);
byte_buffer.rewind();
newBmp.copyPixelsFromBuffer(byte_buffer);
return newBmp;
}