2010-03-16 13 views
25

Desteklenmeyen bir bitmap grafik bağlamı piksel biçimine sahip bir PNG resmim var. Ben görüntüyü yeniden boyutlandırmak girişiminde zaman, CGBitmapContextCreate() desteklenmeyen bir biçimdeiPhone: CGImage'ın Değiştirilmesi CGImageAlphaInfo

I (kolay okunması için biçimlendirilmiş hatası) aşağıdaki hatayı alırsınız bobinleri:

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

list of supported pixel formats kesinlikle bu kombinasyonu desteklemez. Görünüşe göre görüntüyü yeniden çizmem ve alfa kanalı bilgilerini kCGImageAlphaPremultipliedFirst or kCGImageAlphaPremultipliedLast'a taşımam gerekiyor.

Bunu yapmayla ilgili hiçbir fikrim yok.

PNG dosyasıyla ilgili olağandışı bir şey yoktur ve bozuk değil. Diğer tüm bağlamlarda iyi çalışır. Bu hatayı yalnızca tesadüfen gördüm. Ancak, kullanıcılarımın biçimlendirilmiş dosyaları benzer şekilde olabilir. Bu nedenle, uygulamanızın içe aktarılan resimlerini kontrol etmem ve bu sorun için düzeltmem gerekecek.

cevap

56

Evet, 8 bit (dizinli) .PNG'ler ile ilgili sorunlar yaşadım. Grafik işlemlerini gerçekleştirmek için daha doğal bir görüntüye dönüştürmek zorunda kaldım. en Eşitlenmemiş açıklamada anlatıldığı gibi

İşte
- (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

Güzel görünüyor, Ben deneyeceğim. Çok fazla işlem yapmaktan zevk alıyorum çünkü korkarım ki yanlışlıkla sadakati yok edeceğim. – TechZen

+0

Sonunda bunu test etmek için uğraştım ve fark edilebilir bir aslına uygunluk kaybı olmadan gayet iyi çalışıyor. Ben UIImage ait Oriyantasyonu OrientationUp şey ama yukarıdaki kod ile bir sorun yaşıyorum – TechZen

+0

- Bu görüntü döndürülmesine neden olur. Görüntünün sınırları aynı kalır, ancak görüntünün içindeki pikseller orijinal sınırlara uyacak şekilde döndürülür ve gerilir. http://stackoverflow.com/questions/5973105/image-clicked-from-iphone-in-portrait-mode-gets-rotated-by-90-degree ancak bu durumda bu kadar: ne anlatılan Bu benzer Soruna neden olduğu ortaya çıkan işlevi normalleştirin. Bunu gören var mı? Bunun için herhangi bir düzeltme var mı? – kurtzmarc

5

ekran ölçek için hesaba Alfons cevabını yöntemin geliştirilmiş bir şekli olan ve aynı zamanda görüntü boyutu kayan nokta değeri ondalık sayılar ile bazı aptal hatalar var: Ben aslında böyle bir şey yaptılar orijinal cevaptan.

SCREEN_SCALE döndüren bir makro ya 1.0 ölçek tanımlanmıştır ya da aygıt ölçeği aslında her türlü değilse ([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;  
}