2011-04-04 16 views
9

मेरे आवेदन में मुझे स्थानीय रूप से और ऑनलाइन संग्रहीत कुछ छवियों का आकार बदलने और क्रॉप करने की आवश्यकता है। मैं Trevor Harmon's tutorial का उपयोग कर रहा हूं जो UIImage+Resize लागू करता है।आईफोन CGContextRef CGBitmapContext असमर्थित पैरामीटर संयोजन बनाएं

मेरे आईफोन 4 (आईओएस 4.3.1) पर सब कुछ ठीक काम करता है, मुझे कोई समस्या नहीं है। लेकिन मेरे आईफोन 3 जी (आईओएस 3.2) पर आकार बदलने और फसल के तरीके किसी भी तस्वीर के लिए काम नहीं कर रहे हैं (स्थानीय रूप से संग्रहीत पीएनजी हैं)।

- (UIImage *)resizedImage:(CGSize)newSize 
      transform:(CGAffineTransform)transform 
     drawTransposed:(BOOL)transpose 
interpolationQuality:(CGInterpolationQuality)quality 
{ 
    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height)); 
    CGRect transposedRect = CGRectMake(0, 0, newRect.size.height, newRect.size.width); 
    CGImageRef imageRef = self.CGImage; 

    CGContextRef bitmap = CGBitmapContextCreate(NULL, 
              newRect.size.width, 
              newRect.size.height, 
              CGImageGetBitsPerComponent(imageRef), 
              0, 
              CGImageGetColorSpace(imageRef), 
              CGImageGetBitmapInfo(imageRef)); 
    if(bitmap == nil) 
     return nil; 

    CGContextConcatCTM(bitmap, transform); 

    CGContextSetInterpolationQuality(bitmap, quality); 

    CGContextDrawImage(bitmap, transpose ? transposedRect : newRect, imageRef); 

    CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap); 
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

    CGContextRelease(bitmap); 
    CGImageRelease(newImageRef); 

    return newImage; 
} 

तरह से किसी ने मुझे बता सकते हैं कि मैं इस मुद्दा है:

Tue Apr 5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate:  unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row. 
Tue Apr 5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row. 
Tue Apr 5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row. 
Tue Apr 5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row. 

यह फसल विधि

- (UIImage *)croppedImage:(CGRect)bounds 
{ 
    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds); 
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    return croppedImage; 
} 

आकार विधि इस है: यह कंसोल आउटपुट है?

धन्यवाद, आंद्रेई

उत्तर

3

ठीक है यह या आपकी मदद नहीं हो सकता है (और मैं सराहना करते हैं कि यह एक पुरानी पोस्ट है)

मैं एक ऐसी ही समस्या हो रही थी क्योंकि चौड़ाई पैरामीटर (आपके मामले में newRect.size.width) में दशमलव अंश घटक था (उदाहरण के लिए 100.0 के बजाय 100.001)। मैं इसे एक पूर्णांक और पीछे टाइप करता हूं, दशमलव भाग को छोटा करता हूं, और समस्या दूर हो जाती है। मुझे लगता है कि यह देखने के लिए एक परीक्षण है कि प्रति घटक x पिक्सल इत्यादि बिट्स की संख्या बढ़ जाती है, और यह आंशिक पिक्सेल/अंक से निपट नहीं सकती है। यदि यह मदद करता है तो इस विधि का उपयोग करने के लिए आपका स्वागत है।

+(CGSize) fixSize:(CGSize) forSize{ 
    NSInteger w = (NSInteger) forSize.width; 
    NSInteger h = (NSInteger) forSize.height; 
    return CGSizeMake(w, h); 
} 
+0

मैं आईओएस 6 पर बिल्कुल वही त्रुटि देख रहा था। इस टिप्पणी ने शायद मुझे एक लंबी टॉपवी टर्वी सवारी बचाई। – er0

5

मुझे पता चला कि यह रंग स्थान के साथ एक समस्या है। CGColorSpaceCreateDeviceRGB() के साथ बस CGImageGetColorSpace (imageRef) को प्रतिस्थापित करें। छवि को सहेजने की कोशिश करते समय यह मेरे लिए काम करता है मुझे AVCaptureSession से मिला है। और इसे छोड़ना मत भूलना!

CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef bitmap = CGBitmapContextCreate(NULL, 
              newRect.size.width, 
              newRect.size.height, 
              CGImageGetBitsPerComponent(imageRef), 
              0, 
              rgbColorSpace,//CGImageGetColorSpace(imageRef), sometimes contains unsupported colorspace 
              bitmapInfo); 
CGColorSpaceRelease(rgbColorSpace); 
3

मैं और iOS 5 सिम्युलेटर के साथ एक ही समस्या से ऊपर जवाब मेरी समस्या का समाधान नहीं किया था: छवियों को लोड नहीं कर रहे थे और अब भी वही सांत्वना त्रुटियों की सूचना दी।

मैं here मिली बहुत लोकप्रिय श्रेणियों का उपयोग कर रहा हूं।

this blog पर लोगों को एक ही समस्या है। 22 नवंबर, 2011 से मैट के जवाब ने मेरी मदद की।

चीयर्स!

0

परीक्षण के लिए 5.1 से 6.1 तक स्विच करते समय मैं सिम्युलेटर में यह समस्या देख रहा था। सिम्युलेटर को बंद करना और इसे फिर से खोलना ऐसा लगता है कि त्रुटि को हटा दिया गया है।

20

यहां जवाब देना क्योंकि मुझे यह त्रुटि मिलने पर सटीक उसी पिक्सेल प्रारूप था। मुझे आशा है कि यह उत्तर किसी की मदद करेगा।

कारण यह मेरे मामले में असफल रहा था, था कि kCGImageAlphaLast नहीं एक की अनुमति दी मूल्य अब और iOS 8 पर है, हालांकि यह आईओएस 7. 32 PBB, 8 बीपीसी संयोजन केवल kCGImageAlphaNoneSkip* और kCGImageAlphaPremultiplied* लिए अनुमति देता है पर अच्छी तरह से काम करता है अल्फा जानकारी। जाहिर है यह हमेशा एक समस्या थी, लेकिन आईओएस 8 से पहले लागू नहीं किया गया था।

- (CGBitmapInfo)normalizeBitmapInfo:(CGBitmapInfo)oldBitmapInfo { 
    //extract the alpha info by resetting everything else 
    CGImageAlphaInfo alphaInfo = oldBitmapInfo & kCGBitmapAlphaInfoMask; 

    //Since iOS8 it's not allowed anymore to create contexts with unmultiplied Alpha info 
    if (alphaInfo == kCGImageAlphaLast) { 
     alphaInfo = kCGImageAlphaPremultipliedLast; 
    } 
    if (alphaInfo == kCGImageAlphaFirst) { 
     alphaInfo = kCGImageAlphaPremultipliedFirst; 
    } 

    //reset the bits 
    CGBitmapInfo newBitmapInfo = oldBitmapInfo & ~kCGBitmapAlphaInfoMask; 

    //set the bits to the new alphaInfo 
    newBitmapInfo |= alphaInfo; 

    return newBitmapInfo; 
} 

मेरे मामले कोड के नाकाम रहने टुकड़ा इस तरह दिख रही है, जहां imageRef एक PNG एप्लिकेशन बंडल से लोड की एक CGImageRef है में:

CGContextRef bitmap = CGBitmapContextCreate(NULL, 
               newRect.size.width, 
               newRect.size.height, 
               CGImageGetBitsPerComponent(imageRef), 
               0, 
               CGImageGetColorSpace(imageRef), 
               CGImageGetBitmapInfo(imageRef)); 

सूत्रों का कहना है: https://stackoverflow.com/a/19345325/3099609

यहाँ मेरी समाधान है

https://developer.apple.com/library/mac/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203-BCIBHHBB

+2

किसी भी व्यक्ति के लिए [ट्रेवर हार्मन के ट्यूटोरियल] (http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/) से UIImage श्रेणियों का उपयोग करने के लिए, कोड ओपी का उपयोग कर रहा है , यह ठीक करने का एक निश्चित तरीका है। – Bigood

संबंधित मुद्दे