2010-12-17 3 views
0

난이 방법으로 떨어져 전달하고 그 결과 CGImageRef을 사용하고 있습니다로 마무리를 위해 설치하는 CGImageDestinationRef에 추가, kUTTypeJPEG : 난 결과 JPEG 최상의 색상이 있는지 확인해야JPEG로 변환 할 때 어떻게 CGImageAlphaInfo를 고려해야합니까?

- (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; 
    } 

원본과 일치합니다.

내 목적에 대한 CGImageAlphaInfo 상수의 실제 역할이 명확하지 않습니다.

나는 Quartz 문서를 읽었으며, Quartz book으로 프로그래밍하기 좋은 책 (Gelphman과 Laden 저)을 읽었지 만, 여전히 내 방법에 대해서는 잘 모른다.

다른 속성 캡처와 함께 jpeg 속성 사전에 kCGImageDestinationLossyCompressionQuality 속성을 1.0으로 설정했습니다.

원본의 색을 유지하기 위해 더 많은 작업을해야합니까?

이것은 macos이며 gc를 사용합니다.

답변

1

JPEG는 알파 (적어도 external masking 또는 an extension 제외)를 지원하지 않으므로 CGImageDestination이 내보내기 단계에서 알파 채널을 버릴 것으로 예상 할 수 있으므로별로 중요하지 않습니다.

원본 이미지의 알파 정보를 먼저 시도해보고 그런 식으로 비트 맵 컨텍스트를 만들 수 없으면 kCGImageAlphaNoneSkipFirst 또는 kCGImageAlphaNoneSkipLast 중 하나를 사용합니다. 물론 다른 대상 파일 형식의 경우 알파와 미리 곱하기 픽셀 형식 중 하나를 사용합니다.

This page에는 CGBitmapContext에서 지원하는 모든 조합 목록이 있습니다.

+0

감사합니다. 그건 내가 필요한 정보와 정확히 일치한다. – lulu

관련 문제