gpt4 book ai didi

objective-c - CGContextClipToMask 返回空白图像

转载 作者:太空狗 更新时间:2023-10-30 03:26:18 24 4
gpt4 key购买 nike

我是 Quartz 新手。我有 2 张图像、一个背景和一个带有切口形状的蒙版,我想将其放在背景上以切出一个部分。生成的图像应该是切口的形状。这是我的面具(中间的形状是 0 alpha):

image mask

这是我的代码:

UIView *canvas = [[[sender superview] subviews] objectAtIndex:0];

UIGraphicsBeginImageContext(canvas.bounds.size);
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef cgContext = CGBitmapContextCreate(NULL, canvas.bounds.size.width, canvas.bounds.size.height, 8, 0, colourSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colourSpace);

CGImageRef maskImage = [[UIImage imageNamed:@"Mask.png"] CGImage];
CGContextClipToMask(cgContext, CGRectMake(0, 0, canvas.frame.size.width, canvas.frame.size.height), maskImage);

CGImageRef maskedImageRef = CGBitmapContextCreateImage(cgContext);
CGContextRelease(cgContext);

UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef];
UIGraphicsEndImageContext();

[button setBackgroundImage:maskedImage forState:UIControlStateNormal];

除了什么都没有出现...知道我哪里出错了吗?非常感谢。

最佳答案

在使用蒙版裁剪上下文之后,您实际上应该在该上下文上绘制一些东西。

除此之外:

  • 您应该使用 UIGraphicsBeginImageContextWithOptions 来支持比例因子。
  • 您正在创建两个上下文,一个使用 UIGraphicsBeginImageContext,另一个使用 CGBitmapContextCreate。一个就够了:)
  • 您应该“翻转”蒙版的 alpha,因为根据文档 蒙版的源样本确定剪切区域的哪些点发生了变化。换句话说,透明将变得透明

简单的示例代码,我在 imageView 中剪切图像,然后将其设置回去:

UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextTranslateCTM(context, 0.0, self.imageView.frame.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGImageRef maskImage = [[UIImage imageNamed:@"mask.png"] CGImage];
CGContextClipToMask(context, self.imageView.bounds, maskImage);

CGContextTranslateCTM(context, 0.0, self.imageView.frame.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

[[self.imageView image] drawInRect:self.imageView.bounds];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

self.imageView.image = image;

使用 CGImageCreateWithMask 的例子:

UIImage *image = [UIImage imageNamed:@"image"];

CGImageRef originalMask = [UIImage imageNamed:@"mask"].CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(originalMask),
CGImageGetHeight(originalMask),
CGImageGetBitsPerComponent(originalMask),
CGImageGetBitsPerPixel(originalMask),
CGImageGetBytesPerRow(originalMask),
CGImageGetDataProvider(originalMask), nil, YES);

CGImageRef maskedImageRef = CGImageCreateWithMask(image.CGImage, mask);

UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef scale:image.scale orientation:image.imageOrientation];

CGImageRelease(mask);
CGImageRelease(maskedImageRef);

关于objective-c - CGContextClipToMask 返回空白图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10801723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com