我正在转发此方法,并使用结果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。
答案 0 :(得分:1)
没关系,因为JPEG不支持alpha(至少,不是没有external masking或an extension),所以你可以预期CGImageDestination将丢弃alpha通道出口阶段。
我会首先尝试原始图像的alpha信息,如果我不能这样创建位图上下文,我会使用kCGImageAlphaNoneSkipFirst
或kCGImageAlphaNoneSkipLast
。当然,对于其他目标文件格式,我会使用alpha-with-premultiplied-colors像素格式之一。
This page包含CGBitmapContext支持的完整组合列表。