Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa touch 掩蔽图像_Cocoa Touch_Uiimage_Core Graphics_Transparent_Mask - Fatal编程技术网

Cocoa touch 掩蔽图像

Cocoa touch 掩蔽图像,cocoa-touch,uiimage,core-graphics,transparent,mask,Cocoa Touch,Uiimage,Core Graphics,Transparent,Mask,我正在开发一个可以更改边框或矩形图像的应用程序。边框会有所不同,但看起来像是用剪刀或类似的东西剪下的 最好的方法是什么 我的第一个想法是准备一束具有我想要的正确边界效果的透明PNG,然后用它作为我的UIImage的遮罩。这条路对吗?还是有更灵活的编程方式来实现这一点?是的,这正是您需要做的。最好的方法是使用核心图形;Quartz 2D编程指南有一个。您可以通过CGImage属性从UIImage对象获取cgimagerf(这些核心图形方法使用的),然后从更改的(屏蔽的)对象获取UIImagecgi

我正在开发一个可以更改边框或矩形图像的应用程序。边框会有所不同,但看起来像是用剪刀或类似的东西剪下的

最好的方法是什么


我的第一个想法是准备一束具有我想要的正确边界效果的透明PNG,然后用它作为我的UIImage的遮罩。这条路对吗?还是有更灵活的编程方式来实现这一点?

是的,这正是您需要做的。最好的方法是使用核心图形;Quartz 2D编程指南有一个。您可以通过
CGImage
属性从
UIImage
对象获取
cgimagerf
(这些核心图形方法使用的),然后从更改的(屏蔽的)对象获取
UIImage
cgimagerf
使用
UIImage
类方法
+imageWithCGImage:

以下是可用于屏蔽图像的核心图形调用:

//Mask Image
UIImage *inputImage = [UIImage imageNamed:@"inputImage.png"];
CGImageRef maskRef = [UIImage imageNamed:@"mask.png"].CGImage; 

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

CGImageRef masked = CGImageCreateWithMask([inputImage CGImage], mask);
CGImageRelease(mask);

UIImage *maskedImage = [UIImage imageWithCGImage:masked];

CGImageRelease(masked);

我写了一篇文章,介绍了我如何在自己的应用程序中使用它

下面的示例代码应该可以帮助您入门,它需要原始图像和遮罩图像作为输入,并返回遮罩图像作为输出

- (UIImage*) maskImage:(UIImage *) image withMask:(UIImage *) mask
{
    CGImageRef imageReference = image.CGImage;
    CGImageRef maskReference = mask.CGImage;

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference),
                                             CGImageGetHeight(maskReference),
                                             CGImageGetBitsPerComponent(maskReference),
                                             CGImageGetBitsPerPixel(maskReference),
                                             CGImageGetBytesPerRow(maskReference),
                                             CGImageGetDataProvider(maskReference),
                                             NULL, // Decode is null
                                             YES // Should interpolate
                                             );

    CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask);
    CGImageRelease(imageMask);

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference];
    CGImageRelease(maskedReference);

    return maskedImage;
}

还有另一种使用路径的方法。我已经发布了一段代码,它可以用一个圆圈来完成,并且可以很容易地进行编辑,以处理任何闭合路径


谢谢!我一直在想怎么做。对于后人来说,你的第一个UIImage alloc中有一个小错误:应该像你的第二个一样说
imageNamed
。需要用CGImage更新
imageWithCGImage:
imageWithCGImage:scale:orientation:
UIImage中的CGImage如果是从CIImage创建的,那么它是空的,所以要小心。我已经看过了,不幸的是,我无法让它发挥作用。我把图像放在第一个参数中,比B&W图像放在第二个参数中,两者大小相同,输出与第一个图像完全相同。你的教程链接断开了。