主机 machine/device 的字节顺序是什么?
What is the endian order of the host machine/device?
实际上最初的问题是:“kCGBitmapByteOrderDefault 到底是什么?”因为有时 CGImageGetByteOrderInfo(CGImageRef image) returns kCGBitmapByteOrderDefault 作为结果。但这只是告诉它等于主机的字节顺序 machine/device.
然后问题自动变为:“主机 machine/device 的字节序是什么?”
Apple 文档告诉我们有几个常量可以作为确切答案:
kCGImageByteOrder16Big
kCGImageByteOrder16Little
kCGImageByteOrder32Big
kCGImageByteOrder32Little
所以,我需要 returns 上面列表中的一些值的解决方案。
你说:
Because sometimes CGImageGetByteOrderInfo(CGImageRef image)
returns kCGBitmapByteOrderDefault
as a result. But this just tells that it is equal to the endian order of the host machine/device.
不是机器的字节序。这是 CoreGraphics 的默认字节顺序。请参阅 Apple 论坛上的 What does kCGBitmapByteOrderDefault
actually mean?。他们指出,虽然没有记录,但 kCGBitmapByteOrderDefault
似乎采用了 big-endian 顺序。
一个人可以通过创建一个 kCGBitmapByteOrderDefault
上下文来确认这一点,另一个人可以通过 kCGBitmapByteOrder32Big
来确认这一点,并比较它们如何呈现特定颜色。在我的 little-endian 机器上,kCGBitmapByteOrderDefault
的结果与 kCGBitmapByteOrder32Big
的结果相同,而不是 kCGBitmapByteOrder32Little
。这与该论坛讨论中的主张一致。
FWIW、PNG 和 JPG 使用“网络字节顺序”(即 big-endian)。此外,有一种直观的吸引力,例如,让 RGBA 图像的字节按红色、绿色、蓝色然后是 alpha 的顺序出现,而不是相反。如果 CoreGraphics 想选择一个不考虑硬件的标准来使用,big-endian 不是一个不合理的选择。我只是希望他们记录下来。
话虽如此,当我需要 access/manipulate 图像的像素缓冲区时,我总是将图像渲染到具有显式字节顺序的缓冲区,如 Apple Technical Q&A QA1509. Personally, though, I let let CoreGraphics manage the data provider for me, rather than manual malloc
/free
suggested by that old Technical Q&A doc. See this permutation 的 QA1509 代码中所述.
实际上最初的问题是:“kCGBitmapByteOrderDefault 到底是什么?”因为有时 CGImageGetByteOrderInfo(CGImageRef image) returns kCGBitmapByteOrderDefault 作为结果。但这只是告诉它等于主机的字节顺序 machine/device.
然后问题自动变为:“主机 machine/device 的字节序是什么?”
Apple 文档告诉我们有几个常量可以作为确切答案:
kCGImageByteOrder16Big
kCGImageByteOrder16Little
kCGImageByteOrder32Big
kCGImageByteOrder32Little
所以,我需要 returns 上面列表中的一些值的解决方案。
你说:
Because sometimes
CGImageGetByteOrderInfo(CGImageRef image)
returnskCGBitmapByteOrderDefault
as a result. But this just tells that it is equal to the endian order of the host machine/device.
不是机器的字节序。这是 CoreGraphics 的默认字节顺序。请参阅 Apple 论坛上的 What does kCGBitmapByteOrderDefault
actually mean?。他们指出,虽然没有记录,但 kCGBitmapByteOrderDefault
似乎采用了 big-endian 顺序。
一个人可以通过创建一个 kCGBitmapByteOrderDefault
上下文来确认这一点,另一个人可以通过 kCGBitmapByteOrder32Big
来确认这一点,并比较它们如何呈现特定颜色。在我的 little-endian 机器上,kCGBitmapByteOrderDefault
的结果与 kCGBitmapByteOrder32Big
的结果相同,而不是 kCGBitmapByteOrder32Little
。这与该论坛讨论中的主张一致。
FWIW、PNG 和 JPG 使用“网络字节顺序”(即 big-endian)。此外,有一种直观的吸引力,例如,让 RGBA 图像的字节按红色、绿色、蓝色然后是 alpha 的顺序出现,而不是相反。如果 CoreGraphics 想选择一个不考虑硬件的标准来使用,big-endian 不是一个不合理的选择。我只是希望他们记录下来。
话虽如此,当我需要 access/manipulate 图像的像素缓冲区时,我总是将图像渲染到具有显式字节顺序的缓冲区,如 Apple Technical Q&A QA1509. Personally, though, I let let CoreGraphics manage the data provider for me, rather than manual malloc
/free
suggested by that old Technical Q&A doc. See this permutation 的 QA1509 代码中所述.