2011-02-08 28 views
12

Tôi muốn tạo đối tượng UIImage từ một số UIView. Chế độ xem KHÔNG mờ. cho rằng tôi đang sử dụng đoạn mã sau:Sự cố với tính minh bạch khi chuyển đổi UIView thành UIImage

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

Nhưng đối với một số lý do thay vì nền trong suốt tôi nhận được một hình ảnh với nền đen. Tôi đã cố đặt thông số "mờ" trong UIGraphicsBeginImageContextWithOptions thành NO nhưng không có kết quả khác.

Bất kỳ đề xuất nào?

(tương tự câu hỏi CGContext transparency problem không có câu trả lời)

Trả lời

2

Tôi khá chắc chắn rằng bạn không thể định nghĩa một sự minh bạch khi tạo UIImages như thế này - bạn có thể che giấu UIImageView của bạn mà sử dụng hình ảnh mặc dù.

Something như các chức năng sau cho phép cho loại hình này hoạt động:

// 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; 
} 

Bạn hơn có thể gọi nó như thế này:

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

masked_image.png cần phải được một hình ảnh chuyển alpha mà sẽ cắt bỏ bg đen của bạn.

+0

bạn có thể vui lòng cho tôi biết thêm chi tiết những gì bạn có ý nghĩa bởi "mặt nạ xem hình ảnh của tôi"? Và nó sẽ hoàn thành những gì tôi đang cố gắng để đạt được? –

+0

có thể sử dụng hình ảnh gif làm mặt nạ hình ảnh không? – Dhruv

+0

@Lemonsanver: CopyImageAndAddAlphaChannel Tôi nhận biểu tượng này là biểu tượng không xác định .. Vui lòng cho tôi biết những gì có thể làm ngay bây giờ – Seeker

0

tôi chỉ gặp vấn đề tương tự này. những gì làm việc cho tôi đã được đảm bảo rằng tôi đã làm việc với PNGs và không phải JPG, vì JPG không hỗ trợ kênh alpha. hy vọng điều này phù hợp với bạn.

42

Trừ khi tôi là thiếu một cái gì đó, tôi tin rằng bạn sẽ có được kết quả mà bạn muốn bằng cách thiết lập đục để NO

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

Bạn đã lưu ngày của tôi! –

+0

hahaha câu trả lời tuyệt vời. không chắc chắn lý do tại sao điều này không được đánh dấu là giải pháp nhưng w.e! –

+0

Thay vì đặt rõ ràng tham số mờ thành NO, thay vào đó hãy sử dụng 'view.opaque', miễn là chế độ xem đã được xác định là không mờ. Điều này cho phép cùng một mã hoạt động cho các chế độ xem mờ và không mờ đục. –

Các vấn đề liên quan