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

标签 cocoa macos quartz-graphics cgimage

我将移交给此方法,并使用生成的 CGImageRef 将其添加到 CGImageDestinationRef 中,该 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;
    }

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

我不清楚的是 CGImageAlphaInfo 常量对于我的目的的实际作用。

我已经阅读了 Quartz 文档,以及优秀的《Programming With Quartz》一书(Gelphman 和 Laden 撰写),但我仍然不确定我的方法。

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

我应该做更多的事情来保持原件的颜色完整性吗?

这是 macOS,并且使用 gc。

最佳答案

这并不重要,因为 JPEG 不支持 Alpha(至少不支持 external maskingan extension ),因此您可以预期 CGImageDestination 将在导出阶段丢弃 Alpha channel 。

我会首先尝试原始图像的 Alpha 信息,如果无法以这种方式创建位图上下文,我会使用 kCGImageAlphaNoneSkipFirstkCGImageAlphaNoneSkipLast。当然,对于其他目标文件格式,我会使用带有预乘颜色的 alpha 像素格式之一。

This page具有 CGBitmapContext 支持的组合的完整列表。

关于cocoa - 转换为 JPEG 时我应该如何考虑 CGImageAlphaInfo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4472894/

相关文章:

ios - 在 View 中绘制多个 UIBezierPath

iphone - 使用 CALayer 时无法编译代码

Cocoa 垃圾收集和保留周期

objective-c - 如何在 OS X 上制作圆角 WKWebView?

macos - Kdiff3 FSPathMakeRef(app_path_location) 失败,错误为 -43 Mac OS-X

python-3.x - Sublime Text 3 在 '__main__' 中找不到 '' 模块

cocoa - NSArrayController 和 KVO

objective-c - 无法获得管理员权限。错误域=CFErrorDomainLaunchd 代码=2 "The operation couldn’ 无法完成。 (CFErrorDomainLaunchd 错误 2。)

iphone - 如何将 Cocoa 应用程序移植到 iPhone-OS?

objective-c - 使用 CAGradientLayer 时的内存错误