2011-02-08 11 views
12

UIViewからUIImageオブジェクトを作成したいとします。ビューは不透明ではありません。そのため 私は、次のコードを使用しています:UIViewをUIImageに変換する際の透明度の問題

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

をしかし、その代わりに透明な背景の何らかの理由で私は、黒の背景で画像を取得しています。 UIGraphicsBeginImageContextWithOptionsの "不透明"パラメータをNOに設定しようとしましたが、結果は変わりません。

提案がありますか?

(無応答と同様の質問CGContext transparency problem

答えて

2

は、私はこのようなUIImagesを作成するときに透明度を定義することはできません確信している - あなたががイメージを使用して、あなたのUIImageViewをマスクすることができます。以下の機能のような

何かがこのタイプの動作を可能に:

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

あなたはよりも、このようにそれを呼び出すことができます。

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

masked_image.pngは意志アルファチャネリング画像にする必要がありますあなたの黒いbgを切り取ってください。

+0

に不透明設定することで、あなたが望む結果を得ると考えているあなたは、「私のイメージビューをマスキングする」とはどういう意味ですか私に詳細を記入してくださいことはできますか?そしてそれは私が達成しようとしていることを達成するだろうか? –

+0

イメージをマスキングイメージとして使用できますか? – Dhruv

+0

@Lemonsanver:CopyImageAndAddAlphaChannel私は未定義のシンボルとしてこれを持っています..今何ができるか教えてください – Seeker

0

私はちょうど同じ問題を克服しました。 JPGはアルファチャンネルをサポートしていないので、私が働いてくれたのは、JPGではなくPNGで作業していたことを確認することでした。これがあなたのために働くことを望みます。私は何かが欠けていない限り

42

、私はあなたが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

あなたは私の日を救った! –

+0

haha​​ha素晴らしい答え。なぜこれが解決策としてマークされていないのか分かりませんが、w.e! –

+0

明示的に不透明パラメータをNOに設定する代わりに、ビューが不透明でないと定義されていれば、 'view.opaque'を代わりに使用してください。これにより、不透明なビューと非不透明なビューで同じコードが機能します。 –

関連する問題