سؤال

ولدي صورة PNG التي تحتوي على رسومات نقطية شكل السياق بكسل غير معتمد. كلما أحاول تغيير حجم الصورة، الإختناقات CGBitmapContextCreate() على شكل غير معتمد

وأنا تظهر رسالة الخطأ التالية (خطأ تنسيق لتسهيل القراءة):

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

في قائمة التنسيقات بكسل المتوافقة بالتأكيد لا يدعم هذا الجمع. ويبدو أنني بحاجة لإعادة رسم الصورة ونقل المعلومات قناة ألفا إلى <لأ href = "http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CGImage/Reference/reference.html#// apple_ref / وثيقة / رمز المستخدم / TP30000956-CH3g-C016217 "يختلط =" noreferrer "> kCGImageAlphaPremultipliedFirst أو kCGImageAlphaPremultipliedLast .

وليس لدي أي فكرة عن كيفية التوجه نحو ذلك.

وليس هناك شيء غير عادي حول الملف PNG وعدم تلف ذلك. وهو يعمل في كل سياق آخر على ما يرام. أنا واجهت هذا الخطأ فقط بالصدفة ولكن من الواضح مستخدمي موقعي قد بالمثل تنسيق الملفات ولذا فإنني سوف تضطر إلى التحقق من الصور المستوردة بلدي التطبيق والصحيح لهذه المشكلة.

هل كانت مفيدة؟

المحلول

نعم، كان لي مشاكل مع (فهرستها) .PNGs 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;    
}

نصائح أخرى

وهنا نسخة محدثة من طريقة من الفونس الإجابة على حساب لنطاق الشاشة، وأيضا بعض الأخطاء الساذجة مع الكسور العشرية في القيم النقطة العائمة من حجم الصورة كما هو موضح في تعليق غير المتزامنة من الإجابة الأصلية.

وSCREEN_SCALE هو الماكرو الذي يعود إما 1.0 إذا لم يتم تعريف نطاق أو أيا كان حجم الجهاز هو في الواقع ([UIScreen mainScreen] .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;    
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top