我尝试从位图(System.Drawing.Bitmap)中获取所有字节值。因此,我锁定字节并复制它们:
public static byte[] GetPixels(Bitmap bitmap){
if(bitmap-PixelFormat.Equals(PixelFormat.Format32.bppArgb)){
var argbData = new byte[bitmap.Width*bitmap.Height*4];
var bd = bitmap.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
System.Runtime.InteropServices.Marshal.Copy(bd.Scan0, argbData, 0, bitmap.Width * bitmap.Height * 4);
bitmap.UnlockBits(bd);
}
}
我用一个非常简单的带有像素(红、绿、蓝、白)的2x2 PNG图像测试了这个图像,它是我在Photoshop中创建的。由于格式的原因,我在argbData中期望得到以下值:
255 255 0 0 255 0 255 0
255 0 0 255 255 255 255 255
但是我得到了:
0 0 255 255 0 255 0 255
255 0 0 255 255 255 255 255
但这是一种BGRA格式。有人知道为什么字节看起来是交换的吗?顺便说一下,当我直接将图像用于Image.Source时,如下所示,图像显示正确。那我有什么错呢?
<Image Source="D:/tmp/test2.png"/>
发布于 2011-11-12 20:55:00
像素数据是ARGB,1字节代表alpha,1字节代表红色,1字节代表绿色,1字节代表蓝色。Alpha是最高有效字节,蓝色是最低有效字节。在小端机器上,像您的机器和许多其他机器一样,首先存储小端,因此字节顺序是bb gg rr aa。所以0 0 255等于蓝色= 0,绿色= 0,红色= 255,阿尔法= 255。那是红色的。
当您将bd.Scan0转换为int* (指向整数的指针)时,此字节序顺序细节将消失,因为整数也是以低字节顺序存储的。
发布于 2016-12-30 04:38:55
采用Bpp32Argb像素格式。你不需要逐个字节的访问。
在不安全的上下文中将Scan0转换为Int32指针。
unsafe
{
var ptr=(int*)bmData.Scan0;
}
你可以像下面这样做一些位操作来访问第一个像素的颜色通道。
并且不需要关心字节顺序。
var a=(ptr[0] & 0xFF000000)>>24;
var r=(ptr[0] & 0x00FF0000)>>16;
var g=(ptr[0] & 0x0000FF00)>>8;
var b=(ptr[0] & 0x000000FF);
顺便说一句,你可以很容易地使用返回int
的Color.ToArgb()
。
发布于 2011-11-12 20:40:46
它在技术上基于COLORREF
(在Windows GDI/GDI+中到处使用),并存储在内存中……请参阅http://msdn.microsoft.com/en-us/library/dd183449%28VS.85%29.aspx
https://stackoverflow.com/questions/8104461
复制相似问题