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

C# 在给定指针地址读取3个字节的最快方法?,c#,.net,performance,bitmap,int,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); byt

我当前正在使用锁定位图后可用的
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;
//读取像素颜色
字节*Pix=(字节*)bmpScan0+(y*bmpStride)+(x*3);
字节R=*(Pix+2);
字节G=*(Pix+1);
字节B=*(Pix);

int RGB=((int)R你的意思是:

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

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

您的意思是:

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

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

您可以读取像素地址处的完整整数并屏蔽掉多余的字节,而无需执行多重操作(读取、屏蔽等)

int Pix = *(int*)((byte*)bmpScan0 + (y * bmpStride) + (x * 3)) & 0x00FFFFFF;
根据你的endianness,你可能需要下移而不是蒙版,你的颜色成分可能会反转-BGR而不是RGB


哦,由于从没有对齐到4字节边界的内存中读取,您可能会遇到一些速度问题。您可以绕过这些问题,但解决方案往往比原来的问题更糟糕。

您可以在像素地址读取完整的整数并屏蔽多余的字节,而不是执行多重操作(读取、屏蔽等)

int Pix = *(int*)((byte*)bmpScan0 + (y * bmpStride) + (x * 3)) & 0x00FFFFFF;
根据你的endianness,你可能需要下移而不是蒙版,你的颜色成分可能会反转-BGR而不是RGB


哦,由于从没有对齐到4字节边界的内存中读取,您可能会遇到一些速度问题。你可以绕过这些问题,但解决方案往往比原来的问题更糟糕。

@MitchWheat啊,很好的观点;位图像素格式到处都是…你的示例代码与你的要求不一致-它显示将3个字节读入单独的变量,而不是将8个最高位屏蔽的
int
。。。也可以考虑显示更多的代码-你看起来像是为了获得下一个字节的数学运算。@ AlxeILVENKOV-我更新了我的代码来显示我需要达到的目标。P@MitchWheat啊,说得很好,;位图像素格式到处都是…你的示例代码与你的要求不一致-它显示将3个字节读入单独的变量,而不是将8个最高位屏蔽的
int
。。。也可以考虑显示更多的代码——一个看起来像是为了获得下一个字节的数学公式。@ AlxeILVENKOV-我已经更新了我的代码来显示我需要实现的东西。对我来说,看起来不像C.Y.:PMI代码已经比这个方法快了。我正在寻找更快的东西。我的代码已经比这个方法快了。我在找更快的东西。我相信这是正确的方法(显然不需要计算“当前”像素,因为
+=3
应该执行“下一步移动”操作)。。。但是@Geotarget已经在JerKimball的答案中否定了这种方法——因此不清楚OP在寻找什么。OP否定了这个答案,因为它没有用一行代码读取3个字节。我真的不需要R/G/B拆分字节。我之所以使用它,是因为我别无选择。@Geotarget-我想是这样的。+1。我相信这是正确的方法(显然不需要计算“当前”像素,因为
+=3
应该执行“下一步移动”操作)。。。但是@Geotarget已经在JerKimball的答案中否定了这种方法——因此不清楚OP在寻找什么。OP否定了这个答案,因为它没有用一行代码读取3个字节。我真的不需要R/G/B拆分字节。我之所以使用它,是因为我别无选择。@Geotarget-我想是这样的。