微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么RGBTRIPLE和RGBQUAD以BGR顺序存储数据?

在Windows中,RGBTRIPLE和RGBQUAD结构以相反的顺序定义。 这是违反直觉的,我想这一定是故意的。 当然,这并不重要,但这已经给我带来了很多麻烦,所以我觉得值得一提。 所以为什么?

定义:

typedef struct tagRGBTRIPLE { BYTE rgbtBlue; BYTE rgbtGreen; BYTE rgbtRed; } RGBTRIPLE,*PRGBTRIPLE,NEAR *NPRGBTRIPLE,FAR *LPRGBTRIPLE; typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD;

使用Windows监视器configurationfunction时发生I2C错误

Nodejs OLE-COM服务器

如何可靠地检查一个Windows进程是否是C ++中的另一个父进程?

什么是在Windows中实现沉重的graphics的最合适的方法

将django manage.py输出(在Windows中)redirect到一个文本文件

在另一个程序/脚本中实时使用Sysinternals Process Monitor的输出

在Windows上os.stat()

删除其他用户userfolder作为pipe理员结果拒绝访问

我怎样才能让一个ListView的列自动resize编程?

为什么“你想让这个应用程序对Windows上的设备进行更改”

颜色顺序存储本质上没有什么特别的意义:你可以以任何顺序存储组件,重要的是只要同意选择哪个顺序。

尽管如此,这些结构的BGR格式与用于DIB的组件顺序相匹配(至少在小端机上 – 但所有的DIB格式都是用LE设计的),所以如果你在内存中有一个24位的DIB,使用RGBTRIPLE结构读取其颜色数据,并使用指针算法“移动”它; 但是,对于32位DIB和RGBQUAD (“保留”字节应该是第一个成员)。

RGBQUAD结构被用于DIB的调色板; 填充字节几乎肯定是出于性能的原因,允许直接使用从文件中读取的调色板数据作为颜色的查找表,将它们保持在DWORD边界上。

那么,为什么选择DIB的BGR订单呢? 我认为在DIB设计的时候它有一些性能上的优势(我们正在谈论OS / 2的演示管理器,〜1988),可能从大多数显卡的DIB到内存格式的转换是比较便宜的这条路。

编辑

好吧,这个命令是来自OS / 2 Presentation Manager的剩余命令, 这一点在这篇1992年的KB文章中得到了证实,

红色,绿色和蓝色字节与Windows约定相反(红色与蓝色交换位置)。 这是Presentation Manager兼容性的另一个剩余部分。

(顺便说一句,我在DIB中OS / 2 PM最讨厌的剩余行数是来自OS / 2 PM中使用的认坐标系的行的相反顺序)

一个小型机器(又名x86和朋友)上,结构与Bitmap的颜色数据的数据格式完全匹配。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐