首页  >  文章  >  Java  >  为什么使用 copyPixelsToBuffer 转换位图后我的字节数组包含零?

为什么使用 copyPixelsToBuffer 转换位图后我的字节数组包含零?

Patricia Arquette
Patricia Arquette原创
2024-11-06 15:45:02211浏览

Why Does My Byte Array Contain Zeros After Converting a Bitmap Using copyPixelsToBuffer?

通过字节数组转换保留位图数据

位图操作是 Android 开发中的一项常见任务,通常涉及将位图转换为字节数组以进行数据存储或传输。然而,一些开发人员在尝试执行此转换时遇到困难,导致出现以下问题:

问:为什么使用 copyPixelsToBuffer 转换位图后复制的字节数组用零填充?

提供的代码片段演示了使用 copyPixelsToBuffer 将位图转换为字节数组的尝试,但生成的缓冲区仅包含零。为了理解这个问题的原因,我们来分析一下代码:

  • 位图是从 Intent 中获取的。
  • 它的大小是使用位图的高度和行字节来计算的。
  • 分配计算出的大小的 ByteBuffer。
  • 调用 copyPixelsToBuffer 将位图像素复制到缓冲区中。
  • 创建相同大小的字节数组。
  • 缓冲区被检索到字节数组中。

经过进一步检查,很明显问题出在 copyPixelsToBuffer 方法本身。当使用不可变位图时,它不执行实际的像素复制,而是返回重复的引用。因此,对位图的任何后续修改都不会反映在复制的缓冲区中。

解决方案:位图转换的替代方法

要有效地将位图转换为字节数组,有一个替代方法必须受雇。一种可靠的方法是使用 PNG 或 JPEG 等格式压缩位图,并将压缩数据存储在字节数组中。下面是一个示例:

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

此代码片段遵循以下步骤:

  • 使用 ByteArrayOutputStream 将位图压缩为 PNG 或 JPEG 格式。
  • 获取将数据压缩为字节数组。
  • 转换完成后释放原始位图。

请记住,还可以使用 BitmapFactory 类从字节数组中检索位图数据:

BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

以上是为什么使用 copyPixelsToBuffer 转换位图后我的字节数组包含零?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn