当前位置: 首页 > 编程语言 > C#

PixelFormat.Format32bppArgbseemstohavebyteordershare

时间:2023-04-11 11:32:31 C#

PixelFormat.Format32bppArgbseemstohavebyteorder我尝试从Bitmap(System.Drawing.Bitmap)中获取所有字节值。所以我锁定字节并复制它们:4];varbd=bitmap.LockBits(newRectangle(0,0,image.Width,image.Height),ImageLockMode.ReadOnly,bitmap.PixelFormat);System.Runtime.InteropServices.Marshal.Copy(bd.Scan0,??argbData,0,bitmap.Width*bitmap.Height*4);位图.UnlockBits(bd);我用我在Photoshop中创建的带有像素(红色、绿色、蓝色、白色)的非常简单的2×2PNG图像对此进行了测试。由于格式原因,我希望argbData中有以下值:255255002550255025500255255255255255但我得到:002552550255025525500255255255255255但这是BGRA格式。有谁知道为什么字节似乎被交换了?顺便说一句,当我直接使用图像到Image.Source如下所示时,图像显示正确。那我的错是什么?像素数据为ARGB,1字节代表alpha,1代表红色,1代表绿色,1代表蓝色。Alpha是最高有效字节,蓝色是最低有效字节。在像你和其他许多人这样的小端机器上,存储是小端优先的,所以字节顺序是bbggrraa。所以00255255等于蓝色=0,绿色=0,红色=255,alpha=255。那是红色的。当您将bd.Scan0转换为int*(指向整数的指针)时,此字节顺序详细信息会消失,因为整数也存储为小端。AFAIK在技术上基于COLORREF(在WindowsGDI/GDI+中无处不在)并将RGBA存储在内存中......请参阅http://msdn.microsoft.com/en-us/library/dd183449%28VS.85%29。Bpp32Argb像素格式的aspx。您不需要逐字节访问。将Scan0转发到不安全上下文中的Int32指针。不安全{varptr=(int*)bmData.Scan0;您可以执行类似下面的操作来访问第一个像素的颜色通道。并且不需要关心字节顺序。vara=(ptr[0]&0xFF000000)>>24;varr=(ptr[0]&0x00FF0000)>>16;varg=(ptr[0]&0x0000FF00)>>8;varb=(ptr[0]&0x000000FF);顺便说一句,您可以使用Color.ToArgb()轻松返回一个int。以上是C#学习教程:PixelFormat.Format32bppArgb好像字节顺序不对分享全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: