在给定指针地址读取3个字节的最快方法?

时间:2013-02-26 06:32:02

标签: c# .net performance bitmap int

我正在使用锁定位图后可用的BitmapData读取位图的像素数据。我正在使用的方法单独读取每个颜色字节,并且比在给定指针处直接读取4字节int要慢。但不幸的是我的位图是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;

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:-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);

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