4

私のアプリケーションでは、次の手順を実行したいと思います。

1-画面をキャプチャします。この部分は問題ありません。次のコードを使用しています。

- (UIImage *)captureScreen {
    UIGraphicsBeginImageContextWithOptions(self.view.frame.size, YES, 0.0f);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

2-この機能で画像をトリミングしました

- (UIImage *)cropImage(UIImage *)image inRect:(CGRect)rect  {
    CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, rect);
    UIImage *resultImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    return resultImage;
}

3-次に、トリミングされた画像を純粋な白黒マスクでマスクします

- (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 maskedRef = CGImageCreateWithMask([image CGImage], mask);
    UIImage *resultImage = [UIImage imageWithCGImage:maskedRef];
    CGImageRelease(mask);
    CGImageRelease(maskedRef);

    return resultImage;
}

しかし、私が得た結果の画像は、マスクの形状の外側では、画像が透明ではなく黒色になっていることです。誰か助けてもらえますか?

4

2 に答える 2

2

私は問題を解決しました。マスクされる画像のアルファチャンネルが原因です。そのため、マスキングする前に、アルファ チャネルを使用して別の UIImage を作成し、手順を続けます。

これは、アルファ付きの UIImage を作成するためのコードです

- (UIImage *)imageWithAlpha  {
    CGImageRef imageRef = self.CGImage;
    CGFloat width = CGImageGetWidth(imageRef);
    CGFloat height = CGImageGetHeight(imageRef);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context =  CGBitmapContextCreate(nil, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

    CGImageRef resultImageRef = CGBitmapContextCreateImage(context);
    UIImage *resultImage = [UIImage imageWithCGImage:resultImageRef scale:self.scale orientation:self.imageOrientation];

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    CGImageRelease(resultImageRef);

    return resultImage;
}
于 2012-06-06T07:32:54.133 に答える
2

これは私にとってはうまくいきます。それがあなたにとってもうまくいくことを願っています。

- (UIImage*) doImageMask:(UIImage *)mainImage:(UIImage*)maskImage{

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

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/ mainImage.size.width;

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

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

CGContextClipToMask(mainViewContentContext, rect1, maskImageRef);
CGContextDrawImage(mainViewContentContext, rect2, mainImage.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;
}
于 2012-06-06T06:01:36.737 に答える