Как я должен учитывать CGImageAlphaInfo при преобразовании в JPEG? - PullRequest
0 голосов
/ 17 декабря 2010

Я передаю этот метод и использую результирующее 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;
    }

Мне нужно быть уверенным, что полученный JPEG является наилучшим возможным цветовым соответствием для оригинала.

Что мне неясно, так это фактическая роль константы CGImageAlphaInfo для моих целей.

Я прочитал «Кварцевые документы», а также превосходную книгу «Программирование с кварцем» (Гельфмана и Ладена), но я все еще не уверен в своих методах.

Я установил для свойства kCGImageDestinationLossyCompressionQuality значение 1.0 в словаре свойств jpeg вместе с записью других свойств.

Должен ли я делать что-то еще, чтобы сохранить целостность цвета оригинала?

это macos, а с помощью gc.

1 Ответ

1 голос
/ 19 декабря 2010

Это не имеет большого значения, потому что JPEG не поддерживает альфа (по крайней мере, не без внешней маскировки или расширения ), поэтому вы можете ожидать, что CGImageDestination будет выдавать прочь альфа-канал на стадии экспорта.

Сначала я бы попробовал альфа-информацию исходного изображения, и если я не смогу создать растровый контекст таким образом, я бы использовал kCGImageAlphaNoneSkipFirst или kCGImageAlphaNoneSkipLast. Конечно, для других форматов файлов назначения я бы использовал один из форматов пикселей альфа с предварительно умноженными цветами.

Эта страница содержит полный список комбинаций, поддерживаемых CGBitmapContext.

...