2010-03-16 11 views
25

मेरे पास एक पीएनजी छवि है जिसमें असमर्थित बिटमैप ग्राफिक्स संदर्भ पिक्सेल प्रारूप है। जब भी मैं छवि का आकार करने का प्रयास, CGBitmapContextCreate() असमर्थित प्रारूपआईफोन: CGImage का CGImageAlphaInfo बदलना

मैं निम्न त्रुटि (त्रुटि आसानी से पढ़ने के लिए प्रारूपित) प्राप्त पर chokes:

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 पर ले जाने की आवश्यकता है।

मुझे नहीं पता कि यह करने के बारे में कैसे जाना है।

पीएनजी फ़ाइल के बारे में कुछ भी असामान्य नहीं है और यह दूषित नहीं है। यह सभी अन्य संदर्भों में ठीक काम करता है। मुझे बस इस मौके का सामना करना पड़ा लेकिन जाहिर है कि मेरे उपयोगकर्ताओं के पास समान रूप से स्वरूपित फाइलें हो सकती हैं, इसलिए मुझे अपने ऐप की आयातित छवियों को जांचना होगा और इस समस्या के लिए सही होना होगा।

उत्तर

56

हाँ, मुझे 8 बिट (अनुक्रमित) पीएनजी के साथ समस्याएं थीं। ग्राफिक्स परिचालन करने के लिए मुझे इसे एक और मूल छवि में परिवर्तित करना पड़ा।

- (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 का अभिविन्यास ओरिएंटेशनअप के अलावा कुछ भी है - इससे छवि को घुमाया जा सकता है। छवि की सीमाएं वही रहती हैं, लेकिन छवि के अंदर पिक्सेल घुमाए जाते हैं और मूल सीमाओं को फिट करने के लिए फैले होते हैं। यह इस बात के समान है: http://stackoverflow.com/questions/5973105/image-clicked-from-iphone-in-portrait-mode-gets-rotated-by-90-degree लेकिन इस मामले में यह है समस्या को सामान्य करें जो समस्या उत्पन्न कर रहा है। कोई और इसे देखता है? इसके लिए कोई फिक्स? – kurtzmarc

5

यहाँ एक स्क्रीन पैमाने के लिए खाते में Alfons जवाब से विधि के अद्यतन संस्करण, और यह भी चल छवि का आकार की बात मान में दशमलव के साथ कुछ मूर्खतापूर्ण त्रुटियों है के अनसिंक्रनाइज़्ड टिप्पणी में वर्णित के रूप: मैं अनिवार्य रूप से कुछ इस तरह किया मूल उत्तर से।

SCREEN_SCALE एक मैक्रो है जो स्केल परिभाषित नहीं किया गया है या जो भी डिवाइस स्केल वास्तव में है ([यूआईस्क्रीन मुख्यस्क्रीन]। स्केल)।

- (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;  
} 
संबंधित मुद्दे