2010-03-16 2 views
25

지원되지 않는 비트 맵 그래픽 컨텍스트 픽셀 형식을 가진 PNG 이미지가 있습니다. 나는 이미지의 크기를 조절하려고 할 때마다, CGBitmapContextCreate()은 지원되지 않는 형식iPhone : CGImage의 CGImageAlphaInfo 변경

내가 (쉽게 읽을 포맷 오류) 다음과 같은 오류가 나타날 수에 질식 :

CGBitmapContextCreate: unsupported parameter combination: 
    8 integer bits/component; 
    32 bits/pixel; 
    3-component colorspace; 
    kCGImageAlphaLast; 
    1344 bytes/row. 

list of supported pixel formats 확실히이 조합을 지원하지 않습니다. 이미지를 다시 그려 알파 채널 정보를 kCGImageAlphaPremultipliedFirst or kCGImageAlphaPremultipliedLast으로 옮겨야합니다.

나는 어떻게 이런 일을하는지 알지 못합니다.

PNG 파일에 이상한 점이 없으며 손상되지 않았습니다. 그것은 다른 모든 상황에서 잘 작동합니다. 우연히이 오류가 발생했지만 내 사용자의 파일 형식이 비슷하기 때문에 내 앱의 가져온 이미지를 확인하고이 문제를 해결해야합니다.

답변

56

예, 8 비트 (인덱싱 된) .PNG 파일에 문제가있었습니다. 그래픽 작업을 수행하기 위해 더 원시 이미지로 변환해야했습니다. 의 동기화 주석에 설명 된대로

다음
- (UIImage *) normalize { 

    CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL, 
                 self.size.width, 
                 self.size.height, 
                 8, (4 * self.size.width), 
                 genericColorSpace, 
                 kCGImageAlphaPremultipliedFirst); 
    CGColorSpaceRelease(genericColorSpace); 
    CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault); 
    CGRect destRect = CGRectMake(0, 0, self.size.width, self.size.height); 
    CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage); 
    CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt); 
    CGContextRelease(thumbBitmapCtxt);  
    UIImage *result = [UIImage imageWithCGImage:tmpThumbImage]; 
    CGImageRelease(tmpThumbImage); 

    return result;  
} 
+0

좋아요, 시도해 보겠습니다. 부주의로 충성도를 파괴 할까봐 두려워서 처리하기가 너무 힘듭니다. – TechZen

+0

필자는 마침내 이것을 시험해 보았고 충실도의 분명한 손실없이 잘 작동합니다. – TechZen

+0

UIImage의 imageOrientation이 OrientationUp 이외의 다른 것일 때 위의 코드에 문제가 있습니다. 이로 인해 이미지가 회전됩니다. 이미지의 경계는 동일하게 유지되지만 이미지 내부의 픽셀은 원래 경계에 맞게 회전되고 늘어납니다. 이는 http://stackoverflow.com/questions/5973105/image-clicked-from-iphone-in-portrait-mode-gets-rotated-by-90-degree에 설명되어있는 것과 유사하지만이 경우에는 문제를 일으킨 것으로 보이는 정상 기능. 다른 사람이 이것을 볼 수 있습니까? 이것에 대한 모든 수정? – kurtzmarc

5

는 화면 크기에 대한 계정에는 Alfons 응답에서 방법의 업데이트 된 버전, 또한 이미지 크기의 부동 소수점 값의 소수와 바보 오류입니다 : 나는 기본적으로 이런 짓을 원래의 대답에서.

SCREEN_SCALE은 눈금이 정의되지 않았거나 장치 눈금이 실제로 무엇이든 ([UIScreen mainScreen] .scale) 1.0을 반환하는 매크로입니다.

- (UIImage *) normalize { 

    CGSize size = CGSizeMake(round(self.size.width*SCREEN_SCALE), round(self.size.height*SCREEN_SCALE)); 
    CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL, 
                 size.width, 
                 size.height, 
                 8, (4 * size.width), 
                 genericColorSpace, 
                 kCGImageAlphaPremultipliedFirst); 
    CGColorSpaceRelease(genericColorSpace); 
    CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault); 
    CGRect destRect = CGRectMake(0, 0, size.width, size.height); 
    CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage); 
    CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt); 
    CGContextRelease(thumbBitmapCtxt);  
    UIImage *result = [UIImage imageWithCGImage:tmpThumbImage scale:SCREEN_SCALE orientation:UIImageOrientationUp]; 
    CGImageRelease(tmpThumbImage); 

    return result;  
}