【发布时间】:2014-08-29 05:04:03
【问题描述】:
我目前正在开展一个项目,该项目涉及使用具有自定义 RGBA 值的 PNG。这是我用来创建包含我的自定义 RGBA 值的 PNG NSData 的代码预览(所有这些都正常工作):
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef gtx = CGBitmapContextCreate(&pixelData, width, height, bitsPerComponent, BytesPerRow, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast);
CGImageRef toCGImage = CGBitmapContextCreateImage(gtx);
NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithCGImage:toCGImage];
NSData *pngData = [newRep representationUsingType:NSPNGFileType properties:nil];
当我创建 pixelData(这是一个包含所有 RGBA 值的 uint8_t 数组)并将每个像素的 Alpha 索引设置为 255 时,每个 R/ 的 int 值当我创建它们时,每个像素的 G/B 都是相同的。
这是一个 RGBA 示例 (Alpha = 255) -> (72, 101, 114, 255)
现在,如果我将所有像素的 Alpha 设置为 100,而不是 255,则上述 RGBA 示例将如下所示:(184, 255, 255, 100)。
如您所见,RGB 值与我最初创建的完全不同,我确实需要保留原始值(通过创建NSData 或类似的东西时的自定义属性)或计算它们的方法,不管Alpha 的值是什么。有没有办法做到这一点?
谢谢!
【问题讨论】:
-
尝试
kCGImageAlphaLast而不是kCGImageAlphaPremultipliedLast。无论你做什么来改变 alpha 都会为你预乘:184 = 72 * (255 / 100)。其他两个值被剪裁为 255。 -
尝试使用
kCGImageAlphaLast但现在它给了我一个错误并且没有创建图像。更多细节在这里:pastebin.com/SRde1HP7 -
是的,
kCGImageAlphaLast不在位图图形上下文的supported pixel formats 列表中。 -
在没有 alpha 的情况下运行一次并在最后预乘 alpha 的情况下运行一次是可接受的解决方法吗?这将是一个双重解码,但你要优化什么——努力、速度、代码大小,什么?
标签: objective-c macos cocoa rgb alpha