在文档中,我发现枚举案例定义为:
kCGBitmapByteOrderDefault = (0 << 12)
Run Code Online (Sandbox Code Playgroud)
据我所知,这意味着位移零12次......仍为零.我错过了什么?
如果查看所有相关值,您会看到:
kCGBitmapByteOrderMask = kCGImageByteOrderMask,
kCGBitmapByteOrderDefault = (0 << 12),
kCGBitmapByteOrder16Little = kCGImageByteOrder16Little,
kCGBitmapByteOrder32Little = kCGImageByteOrder32Little,
kCGBitmapByteOrder16Big = kCGImageByteOrder16Big,
kCGBitmapByteOrder32Big = kCGImageByteOrder32Big
Run Code Online (Sandbox Code Playgroud)
并且kCGBitmapByteOrderMask是0x7000(即移位12位后的三位; 0b0111000000000000).
因此,0 << 12这只是一种非常明确的方式,即"在转换为12位后,位是否为0".是的,0 << 12实际上0,但它是明确的,kCGBitmapByteOrderDefault不是当整个CGBitmapInfo值为零时(因为在前12位中可能存在其他有意义的非零数据),但仅当前12位之后的位为零时.
因此,简而言之,这<< 12在技术上并不是必需的,但使意图更加明确.
根据Apple文档:CGBitmapInfo
\n\n\n字节顺序常量指定像素格式的字节顺序。
\n\n...如果代码编写不正确,\xe2\x80\x99s 可能会误读数据,从而导致颜色或 Alpha 显示错误。
\n
的各种常量kCGBitmapByteOrder大多映射到 中类似命名的常量CGImageByteOrder,它没有“默认值”。
这些值可以在文档中详细找到CGImageByteOrderInfo
您询问的是默认值,正如您所指出的位移 0,它仍然是 0,但正如 Rob 指出的那样,前面/后面的位仍然很重要。
\n\n您缺少的是其他选项:
\n\nkCGBitmapByteOrder16Little = (1 << 12)\n16 位、小端格式。
kCGBitmapByteOrder32Little = (2 << 12)\n32 位、小端格式。
kCGBitmapByteOrder16Big = (3 << 12)\n16 位、大端格式。
kCGBitmapByteOrder32Big = (4 << 12)\n32 位、大端格式。
这些使用不同的值,具体取决于 16 位与 32 位图像,以及您是否首先关心最低有效数字或最高有效数字。
\n\n“默认”(0 << 12)遵循相同的格式/过程,即移位 12 位。并且,正如 Rob 指出的那样,前 12 位和后面的任何位也有意义。使用这些其他选项与使用“默认”选项相比,它们的解释方式会产生不同的效果
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |