0

私はこのメソッドに引き継ぎ、その結果を使用して、 としてファイナライズするためにセットアップされCGImageRefた に追加します:CGImageDestinationRefkUTTypeJPEG

- (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のドキュメントを読んだことがあります.また、優れたプログラミング・ウィズ・クオーツの本(GelphmanとLadenによる)も読んだことがあります.

他のプロパティをキャプチャするとともに、jpeg のプロパティ ディクショナリでプロパティ kCGImageDestinationLossyCompressionQuality を 1.0 に設定しました。

元の色の完全性を維持するために、もっと何かをする必要がありますか?

これはmacosで、gcを使用しています。

4

1 に答える 1

1

JPEG はアルファをサポートしていないため (少なくとも、外部マスキングまたは拡張なしではサポートされていないため)、それほど重要ではありません。

最初に元の画像のアルファ情報を試して、その方法でビットマップ コンテキストを作成できない場合は、 または のいずれかを使用しkCGImageAlphaNoneSkipFirstますkCGImageAlphaNoneSkipLast。もちろん、他の宛先ファイル形式の場合は、事前に乗算された色のアルファ ピクセル形式のいずれかを使用します。

このページには、CGBitmapContext でサポートされている組み合わせの完全なリストがあります。

于 2010-12-19T01:14:49.017 に答える