14

私は2つの既存のイメージの合成からイメージマスクを作成しようとしています。 I出力することができる。このUIImage(MaskImageFullCGImageMaskCreateでマスクを作成するとすべて黒(iphone)

UIImage * BaseTextureImage = [UIImage imageNamed:@"background.png"]; 
UIImage * MaskImage = [UIImage imageNamed:@"my_mask.jpg"]; 
UIImage * ShapesBase = [UIImage imageNamed:@"largerimage.jpg"]; 
UIImage * MaskImageFull; 

CGSize finalSize = CGSizeMake(480.0, 320.0); 
UIGraphicsBeginImageContext(finalSize); 
[ShapesBase drawInRect:CGRectMake(0, 0, 480, 320)]; 
[MaskImage drawInRect:CGRectMake(150, 50, 250, 250)]; 
MaskImageFull = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

まずIは、マスキング画像が小さい画像で構成された複合、背景と同じサイズの大きいイメージの作成を開始します)それは右に見える、それはフルサイズの背景サイズであり、それは画面上の適切な場所に、黒で私のマスクオブジェクトを持つ白い背景です。

は、私は、このを通じてMaskImageFull UIImageを渡す:

CGImageRef maskRef = [maskImage CGImage]; 
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
    CGImageGetHeight(maskRef), 
    CGImageGetBitsPerComponent(maskRef), 
    CGImageGetBitsPerPixel(maskRef), 
    CGImageGetBytesPerRow(maskRef), 
    CGImageGetDataProvider(maskRef), NULL, false); 

CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 
UIImage* retImage= [UIImage imageWithCGImage:masked]; 

問題はretImageはすべて黒であるということです。私があらかじめ作られたUIImageをマスクとして送ってもうまくいけば、それは複数の画像からそれを作るようにしようとするときだけです。

私はそれが色空間のものだと思っていましたが、それを修正するように見えませんでした。どんな助けでも大歓迎です!

答えて

19

CGImageCreateWithMaskで同じことを試みましたが、同じ結果が得られました。

CGContextRef mainViewContentContext; 
CGColorSpaceRef colorSpace; 

colorSpace = CGColorSpaceCreateDeviceRGB(); 

// create a bitmap graphics context the size of the image 
mainViewContentContext = CGBitmapContextCreate (NULL, targetSize.width, targetSize.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 

// free the rgb colorspace 
CGColorSpaceRelease(colorSpace);  

if (mainViewContentContext==NULL) 
    return NULL; 

CGImageRef maskImage = [[UIImage imageNamed:@"mask.png"] CGImage]; 
CGContextClipToMask(mainViewContentContext, CGRectMake(0, 0, targetSize.width, targetSize.height), maskImage); 
CGContextDrawImage(mainViewContentContext, CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledWidth, scaledHeight), self.CGImage); 


// Create CGImageRef of the main view bitmap content, and then 
// release that bitmap context 
CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext); 
CGContextRelease(mainViewContentContext); 

// convert the finished resized image to a UIImage 
UIImage *theImage = [UIImage imageWithCGImage:mainViewContentBitmapContext]; 
// image is retained by the property setting above, so we can 
// release the original 
CGImageRelease(mainViewContentBitmapContext); 

// return the image 
return theImage; 
+1

大変お手伝いしました。完成させるために関数のヘッダーとフッターを追加できますか? – Eden

+0

thumbnailPoint.xとは何ですか? @ catlan –

+0

@ Reza.Ab申し訳ありませんが、私は覚えていません。 9年後には縮尺も変わっています。私はほとんどの場合マスクrectと仮定し、イメージrectは同じでなければなりません。それを試してみて、あなたが見つけたものを教えてください。 – catlan

1

アルファチャンネルを使用して作成されなければならないマスクする画像を:私が見つけた解決策は、代わりCGContextClipToMaskを使用することでした。コードからアルファチャンネルを作成することはできません。

4
- (UIImage*) maskImage:(UIImage *)image { 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    UIImage *maskImage = [UIImage imageNamed:@"MaskFinal.png"]; 
    CGImageRef maskImageRef = [maskImage CGImage]; 

    // create a bitmap graphics context the size of the image 
    CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskImage.size.width, maskImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 


    if (mainViewContentContext==NULL) 
     return NULL; 

    CGFloat ratio = 0; 

    ratio = maskImage.size.width/ image.size.width; 

    if(ratio * image.size.height < maskImage.size.height) { 
     ratio = maskImage.size.height/ image.size.height; 
    } 

    CGRect rect1 = {{0, 0}, {maskImage.size.width, maskImage.size.height}}; 
    CGRect rect2 = {{-((image.size.width*ratio)-maskImage.size.width)/2 , -((image.size.height*ratio)-maskImage.size.height)/2}, {image.size.width*ratio, image.size.height*ratio}}; 


    CGContextClipToMask(mainViewContentContext, rect1, maskImageRef); 
    CGContextDrawImage(mainViewContentContext, rect2, image.CGImage); 


    // Create CGImageRef of the main view bitmap content, and then 
    // release that bitmap context 
    CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext); 
    CGContextRelease(mainViewContentContext); 

    UIImage *theImage = [UIImage imageWithCGImage:newImage]; 

    CGImageRelease(newImage); 

    // return the image 
    return theImage; 
} 
+0

本当にうまくいかない... –

関連する問題