2011-02-08 10 views
12

'dan UIImage nesnesini oluşturmak istiyorum. Görünümü opak DEĞİLDİR. bunun için ben aşağıdaki kodu kullanıyorum: UIView'i UIiNitest'e dönüştürürken saydamlık sorunu

+ (UIImage *) imageWithView:(UIView *)view 
{  
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]);  
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];  
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();  UIGraphicsEndImageContext();  
    return img; 
} 

Ama nedense yerine şeffaf arka plan için

i siyah arka plana sahip bir görüntü alıyorum. Zaten UIGraphicsBeginImageContextWithOptions içinde "opak" parametresini NO'a ayarlamaya çalıştım ancak farklı sonuçları yok.

Herhangi bir öneri?

(Yanıtı olmayan Benzer soru CGContext transparency problem)

cevap

2

böyle UIImages oluştururken bir saydamlık tanımlayamazsınız eminim - Eğer olsa görüntüyü kullanır UIImageView maskeleyebilir.

// handles img masking operation 
CGImageRef CopyImageAndAddAlphaChannel(CGImageRef sourceImage) { 
    CGImageRef retVal = NULL; 

    size_t width = CGImageGetWidth(sourceImage); 
    size_t height = CGImageGetHeight(sourceImage); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, 
                  8, 0, colorSpace, kCGImageAlphaPremultipliedFirst); 

    if (offscreenContext != NULL) { 
     CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage); 

     retVal = CGBitmapContextCreateImage(offscreenContext); 
     CGContextRelease(offscreenContext); 
    } 

    CGColorSpaceRelease(colorSpace); 

    return retVal; 
} 
    // png masks can mask png, gif or jpg... 
- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage 
{ 
    CGImageRef maskRef = maskImage.CGImage; 
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
             CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), NULL, false); 

    CGImageRef sourceImage = [image CGImage]; 
    CGImageRef imageWithAlpha = sourceImage; 
    //add alpha channel for images that don't have one (ie GIF, JPEG, etc...) 
    //this however has a computational cost 
    if ((CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) || (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNoneSkipFirst)) 
    { 
     imageWithAlpha = CopyImageAndAddAlphaChannel(sourceImage); 
    } 

    CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask); 
    CGImageRelease(mask); 

    //release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel 
    if (sourceImage != imageWithAlpha) 
    { 
     CGImageRelease(imageWithAlpha); 
    } 

    UIImage* retImage = [UIImage imageWithCGImage:masked]; 
    CGImageRelease(masked); 

    return retImage; 
} 

Sen daha böyle diyebilirsiniz:

UIImage *imgMasked = [self maskImage:[UIImage imageNamed:@"full_image.png"] withMask:[UIImage imageNamed:@"masked_image.png"]]; 

masked_image.png hangi edecek bir alfa kanalize görüntü olması gerekir aşağıdaki işlevlerden gibi

şey Bu tür bir işlem için izin siyah bg'yi kes. Bu aynı problemle karşılaştım sadece

+0

için opak ayarlayarak istediğiniz sonucu elde inanıyoruz? Ve ne elde etmeye çalıştığımı başaracak mı? –

+0

gif resmi maskeleme görüntüsü olarak kullanılabilir mi? – Dhruv

+0

@Lemonsanver: CopyImageAndAddAlphaChannel Ben bunu tanımlanmamış bir sembol olarak aldım .. Lütfen bana şimdi neler yapabileceğini söyle – Seeker

0

. JPG'ler alfa kanalı desteklemediğinden, benim için çalışılan şey, JPG'lerle değil, PNG'lerle çalıştığımı garanti ediyordu. Umarım bu senin için çalışır. Bir şey eksik sürece

42

, sana "benim resim görünümünü maskeleme" ne demek istiyorsunuz siz beni daha fazla ayrıntı verebilir misiniz YOK

UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale); 


+ (UIImage *) imageWithView:(UIView *)view 
{  
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [[UIScreen mainScreen] scale]);  
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];  
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();  UIGraphicsEndImageContext();  
    return img; 
} 
+1

Günümü kurtardın! –

+0

hahaha büyük cevap. bunun neden çözüm olarak işaretlenmediğinden emin değilsiniz ama w.e! –

+0

Opak parametresini HAYIR olarak açıkça ayarlamak yerine, görünümün opak olmadığı belirtilmişse, bunun yerine 'view.opaque' öğesini kullanın. Bu, aynı kodun opak ve opak olmayan görünümler için çalışmasına izin verir. –