1

我目前正在读取位图的像素数据,使用BitmapData锁定位图后的可用。我使用的方法分别读取每个颜色字节,并且比int直接在给定指针处读取 4 字节要慢。但不幸的是,我的位图是 24bpp,这意味着每个像素有 3 个字节,而不是 4 个。那么有没有办法快速读取 3 个字节并将其转换为int给定的指针地址?

// read pixel color
byte* Pix = (byte*)bmpScan0 + (y * bmpStride) + (x * 3);
byte R = *(Pix + 2);
byte G = *(Pix + 1);
byte B = *(Pix);
int RGB = ((int)R << 16) | ((int)G << 8) | (int)B;
4

2 回答 2

2

您可以在像素地址处读取完整的 int 并屏蔽掉额外的字节,而不是多个操作 - 读取、屏蔽等。

int Pix = *(int*)((byte*)bmpScan0 + (y * bmpStride) + (x * 3)) & 0x00FFFFFF;

根据您的字节顺序,您可能需要向下移动而不是屏蔽,并且您的颜色分量可能会反转 - BGR 而不是 RGB。

哦,由于从未与 4 字节边界对齐的内存中读取,您可能会遇到一些速度问题。您可以解决这些问题,但解决方案通常比最初的问题更糟糕。

于 2013-02-26T06:59:58.653 回答
-1

你的意思是这样的:

int foo = *(some pixel address in memory);
byte R = (byte)(foo & 0xff0000 >> 16);
byte G = (byte)(foo & 0x00ff00 >> 8);
byte B = (byte)(foo & 0xff);

编辑:应保留此答案未经编辑以保持其他评论的连续性,但根据对问题本身的编辑不再适用。:)

于 2013-02-26T06:36:02.860 回答