首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PixelFormat.Format32bppArgb似乎有错误的字节顺序

PixelFormat.Format32bppArgb似乎有错误的字节顺序
EN

Stack Overflow用户
提问于 2011-11-12 20:33:04
回答 3查看 19.3K关注 0票数 29

我尝试从位图(System.Drawing.Bitmap)中获取所有字节值。因此,我锁定字节并复制它们:

代码语言:javascript
运行
复制
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中期望得到以下值:

代码语言:javascript
运行
复制
255 255   0   0    255 0   255   0 
255 0     0 255    255 255 255 255 

但是我得到了:

代码语言:javascript
运行
复制
0     0 255 255     0 255   0 255
255   0   0 255   255 255 255 255

但这是一种BGRA格式。有人知道为什么字节看起来是交换的吗?顺便说一下,当我直接将图像用于Image.Source时,如下所示,图像显示正确。那我有什么错呢?

代码语言:javascript
运行
复制
<Image Source="D:/tmp/test2.png"/>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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* (指向整数的指针)时,此字节序顺序细节将消失,因为整数也是以低字节顺序存储的。

票数 53
EN

Stack Overflow用户

发布于 2016-12-30 04:38:55

采用Bpp32Argb像素格式。你不需要逐个字节的访问。

在不安全的上下文中将Scan0转换为Int32指针。

代码语言:javascript
运行
复制
unsafe
{
    var ptr=(int*)bmData.Scan0;
}

你可以像下面这样做一些位操作来访问第一个像素的颜色通道。

并且不需要关心字节顺序。

代码语言:javascript
运行
复制
var a=(ptr[0] & 0xFF000000)>>24;
var r=(ptr[0] & 0x00FF0000)>>16;
var g=(ptr[0] & 0x0000FF00)>>8;
var b=(ptr[0] & 0x000000FF);

顺便说一句,你可以很容易地使用返回intColor.ToArgb()

票数 3
EN

Stack Overflow用户

发布于 2011-11-12 20:40:46

它在技术上基于COLORREF (在Windows GDI/GDI+中到处使用),并存储在内存中……请参阅http://msdn.microsoft.com/en-us/library/dd183449%28VS.85%29.aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8104461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档