转换为JPEG时我应该如何考虑CGImageAlphaInfo?

时间:2010-12-17 17:00:32

标签: cocoa macos quartz-graphics cgimage

我正在转发此方法,并使用结果CGImageRef将其添加到CGImageDestinationRef,该kUTTypeJPEG已设置为- (CGImageRef)scaleImage:(CGImageRef)fullImageRef originalSize:(CGSize)originalSize scale:(CGFloat)scale; { CGSize imageSize = originalSize; CGRect scaledRect = CGRectMake(0.0, 0.0, imageSize.width * scale, imageSize.height * scale); CGColorSpaceRef colorSpace = CGImageGetColorSpace(fullImageRef); CGContextRef context = CGBitmapContextCreate(NULL, scaledRect.size.width, scaledRect.size.height, 8, 0, colorSpace, CGImageGetAlphaInfo(fullImageRef)); CGContextSetInterpolationQuality(context, kCGInterpolationHigh); CGImageRef subImage = CGImageCreateWithImageInRect(fullImageRef, scaledRect); CGContextDrawImage(context, scaledRect, subImage); // offscreen CGImageRef scaledImage = CGBitmapContextCreateImage(context); CGImageRelease(subImage); subImage = NULL; subImage = scaledImage; CGImageRelease(scaledImage); CGContextFlush(context); CGContextRelease(context); return subImage; } 最终确定:

{{1}}

我需要确保生成的JPEG是原始的最佳颜色匹配。

我不清楚的是CGImageAlphaInfo常量在我的目的中的实际作用。

我读过Quartz文档,还有优秀的Quartz编程书(由Gelphman和Laden编写),但我仍然不确定我的方法。

我在jpeg的属性字典中将属性kCGImageDestinationLossyCompressionQuality设置为1.0,同时捕获其他属性。

我应该做些什么来保持原件的颜色完整性吗?

这是macos,并使用gc。

1 个答案:

答案 0 :(得分:1)

没关系,因为JPEG不支持alpha(至少,不是没有external maskingan extension),所以你可以预期CGImageDestination将丢弃alpha通道出口阶段。

我会首先尝试原始图像的alpha信息,如果我不能这样创建位图上下文,我会使用kCGImageAlphaNoneSkipFirstkCGImageAlphaNoneSkipLast。当然,对于其他目标文件格式,我会使用alpha-with-premultiplied-colors像素格式之一。

This page包含CGBitmapContext支持的完整组合列表。