java - 使用缓冲区复制时更改了新位图

标签 java android bitmap bitmapfactory

当我使用 copyPixelsFromBuffer 和 copyPixelsToBuffer 时,位图显示的并不相同,我尝试了以下代码:

Bitmap bm = BitmapFactory.decodeByteArray(a, 0, a.length);
int[] pixels = new int[bm.getWidth() * bm.getHeight()];
bm.getPixels(pixels, 0, bm.getWidth(), 0, 0,bm.getWidth(),bm.getHeight());

ByteBuffer buffer = ByteBuffer.allocate(bm.getRowBytes()*bm.getHeight());
bm.copyPixelsToBuffer(buffer);//I copy the pixels from Bitmap bm to the buffer

ByteBuffer buffer1 = ByteBuffer.wrap(buffer.array());
newbm = Bitmap.createBitmap(160, 160,Config.RGB_565);
newbm.copyPixelsFromBuffer(buffer1);//I read pixels from the Buffer and put the pixels     to the Bitmap newbm.

imageview1.setImageBitmap(newbm);
imageview2.setImageBitmap(bm);

为什么Bitmap bm和newbm显示的内容不一样?

最佳答案

在您的代码中,您使用 RGB_565 将像素复制到位图中格式,而您从中获取像素的原始位图必须采用不同的格式。

问题从documentation就很清楚了的 copyPixelsFromBuffer() :

The data in the buffer is not changed in any way (unlike setPixels(), which converts from unpremultipled 32bit to whatever the bitmap's native format is.

所以要么使用相同的位图格式,要么使用setPixels()或使用 Canvas.drawBitmap() 将原始位图绘制到新位图上打电话。

也可以使用 bm.getWidth() & bm.getHeight()指定新位图的大小而不是硬编码为 160 .

关于java - 使用缓冲区复制时更改了新位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9964138/

相关文章:

android - 三星 Tab3 上的 sendUserActionEvent() mView==null

android - 使用 ACTION_IMAGE_CAPTURE 拍照并 setImageBitmap 来显示它

java - Maven - 检测项目中同一依赖项的多个版本

java - 代码行为异常 : Trying to search an array for string and print contents of each line

用于海量数据的 Android ListView 分页

Android - 是否可以直接在层列表 XML 定义中声明 alpha 掩码?

android - 使用 gradle 任务从 Android sdcard 中提取文件

android - 如何在android放大后画一个圆圈

java - Tibjms javax.jms.JMSException : Connection unknown by server

java - 如何将 Maven zip 依赖项放在类路径上以进行 Java 测试