gpt4 book ai didi

安卓图像表示

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:03 24 4
gpt4 key购买 nike

我正在尝试访问 Android 中图像的原始像素数据。
代码看起来像这样:

   Bitmap bitmap =  BitmapFactory.decodeFile("image.png"); 
// assert valid input
if ((bitmap.getConfig() == null) || bitmap.getConfig() == Config.ARGB_8888)
throw new Exception("bad config");

ByteBuffer buffer = ByteBuffer.allocate(4 * bitmap.getWidth() * bitmap.getHeight());
bitmap.copyPixelsToBuffer(buffer);
return buffer.array();

线性一维buffer.array()中的像素是如何存储的?

  1. 第一个元素是左上角像素还是左下角像素(或其他)?
  2. 行优先(逐行)还是列优先(逐列)?
  3. channel 顺序是 ARGB 还是 BGRA?
  4. 每个 channel 分别是行优先还是列优先?
  5. 其他

最佳答案

获取大小为 width 的图像中给定像素 x,y 的偏移量到 buffer.array() xheight 每像素 bytesPerPixel 字节,使用此公式:

offsetForPixel = (y * width + x) * bytesPerPixel

换句话说,数组中的第一个元素是左上角的像素,后面的元素是行优先的。一个像素的所有数据都存储在相邻的字节中,而不是基于 channel 展开。这是对上面 1、2 和 4 的回答。现在让我们讨论 3,这是事情变得复杂的地方。

使用 Bitmap.copyPixelsToBuffer() 得到的是 Android 低级绘图库使用的原始位图数据表示 skia .这会产生三个重大后果:

  • channel 顺序取决于字节顺序
  • channel 预乘 alpha
  • channel 如何打包成包含数据类型是可配置的

如果您想检查单个像素,最后一点使得使用 Bitmap.copyPixelsToBuffer() 变得很尴尬,因为您根本不知道如何配置 skia 来打包 channel 。作为实验,试试这段代码:

int inputPixel = 0x336699cc;
int[] pixels = new int[] { inputPixel };
Bitmap bm = Bitmap.createBitmap(pixels, 1, 1, Config.ARGB_8888);
ByteBuffer bb = ByteBuffer.allocate(4);
bm.copyPixelsToBuffer(bb);
Log.i("TAG", "inputPixel = 0x" + Integer.toHexString(inputPixel));
for (int i = 0; i < 4; i++) {
String byteString = "0x" + Integer.toHexString(bb.array()[i] & 0xff);
Log.i("TAG", "outputPixel byte " + i + " = " + byteString);
}

当我运行它时,我得到了这个输出:

I/TAG ( 1995): inputPixel = 0x336699cc
I/TAG ( 1995): outputPixel byte 0 = 0x14
I/TAG ( 1995): outputPixel byte 1 = 0x1f
I/TAG ( 1995): outputPixel byte 2 = 0x29
I/TAG ( 1995): outputPixel byte 3 = 0x33

我们可以看到我们正在处理 big endian,内存中的表示是预乘的,并且 channel 已经从 ARGB 重新排列为 RGBA(在 skia 源代码中的动机是相同的-内存表示为 OpenGL)。

如果要读取像素数据,建议使用Bitmap.getPixels()反而。涉及一些复制,但至少 API 指定了返回数据的格式。

关于安卓图像表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8225892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com