【问题标题】:how should i be considering CGImageAlphaInfo when converting to JPEG?转换为 JPEG 时我应该如何考虑 CGImageAlphaInfo?
【发布时间】:2010-12-17 17:00:32
【问题描述】:

我正在使用此方法并使用生成的 CGImageRef 将其添加到设置为最终确定为 kUTTypeJPEGCGImageDestinationRef

- (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。

【问题讨论】:

    标签: cocoa macos quartz-graphics cgimage


    【解决方案1】:

    没关系,因为 JPEG 不支持 alpha(至少,不支持 external maskingan extension),所以您可以预期 CGImageDestination 会在导出阶段丢弃 alpha 通道。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 2014-06-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多