CGContextClipToMask 返回空白图像

2024-01-15

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

这是我的代码:

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。一个就够了:)
  • 你应该“翻转”你的面具的阿尔法,因为根据文档The source samples of mask determine which points of the clipping area are changed。换句话说透明就会变成透明

简单的示例代码,我将图像剪切到 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CGContextClipToMask 返回空白图像 的相关文章

随机推荐

  • 列表框鼠标悬停背景颜色

    我遇到的问题是 MouseOver 触发器在选定的行上为背景着色失败 对于任何未选定的行 鼠标悬停时背景会变成蓝色 但所选行没有蓝色背景 单击一行 然后蓝色背景消失 我还尝试了 ListBox ItemContainerStyle 中的样式
  • XmlDocument.WriteTo 截断生成的文件

    尝试将 XmlDocument 序列化为文件 XmlDocument 相当大 但是 在调试器中我可以看到 InnerXml 属性中包含所有 XML blob 它没有被截断 以下是将 XmlDocument 对象写入文件的代码 Write t
  • 聊天应用程序:node.js 还是 APE?

    我想创建一个聊天应用程序 它将使用 php codeigniter 来执行视图和用户界面 我在 stackoverflow 上阅读了很多推荐 node js 或 socket io 的帖子 但我也遇到过 APE Ajax Push Engi
  • C 中二维数组的内存映射

    你觉得什么这次讨论 http www mattababy org belmonte Teaching CCC CrashCourseC html关于二维数组的内存映射是否正确 尤其是这张照片 http www mattababy org b
  • 如何在 cakephp 中设置 cron 作业?

    我如何使用 cakephp 中的 cron 作业来调用 Ubuntu 上控制器的操作 我试图通过 crontab 来完成它 但它不起作用 使用外壳 在 cron 作业中使用 CakePHP 应用程序的 Cake Way 是创建 shell
  • 抽象类中的公共构造函数是代码吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 抽象类中的公共构造函数是代码吗 将构造函数设置为受保护可以提供您可以使用的所有访问权限 使其成为公共将提供的唯一额外访问权限是允许将类的实例声明
  • 如何导入 require.cache 和 require.resolve

    因为我在 package json 中使用模块类型或import而不是要求 我如何导入 require cache 和 require resolve 我正在尝试重新加载文件并更新所做的更改 error require is not def
  • Scala 类型(推理)问题?

    我正在 Scala 中使用以下方法开发 REST Web 服务Jersey http jersey java net JAX RS 参考实现 我收到一个奇怪的错误 我正在尝试创建一个内容配置 http jersey java net non
  • 更改单元格中部分文本的字体颜色

    我的单元格将包含以下值 Image not allowed png 我想改变颜色 png独自一人或之后发生的任何事情 现在我尝试使用下面的代码更改字体颜色 Cells 4 2 Font Color RGB 255 50 25 它将更改整个单
  • 在包含 AudioToolbox 框架的 Objective-C iOS 项目中找不到 AudioServices.h

    根据苹果文档 AudioServices h应该是AudioToolbox框架的一部分 尽管我已将 AudioToolbox 框架添加到我的 Xcode 项目中 但当我 import AudioServices 时 我收到错误 未找到 Au
  • 在 foreach 中强制转换为数组是否被认为是一种不好的做法?

    在启动 foreach 循环时转换为数组是否被认为是一种不好的做法 像这样的事情 foreach array examples as example Do stuff 这可以防止 为 foreach 提供的参数无效 免于发生 或者首先检查它
  • 如何使用Keras API提取“从输入层到隐藏层”和“从隐藏层到输出层”的权重?

    我是 Keras 新手 我正在尝试获取 Keras 中的权重 我知道如何在 Python 中的 Tensorflow 中执行此操作 Code data np array attributes int64 target np array la
  • MatMul 运算在张量流中如何工作?

    我注意到张量流中定义的 MatMul 运算 形状函数 Status MatMulShape shape inference InferenceContext c ShapeHandle a TF RETURN IF ERROR c gt W
  • 如何更改Mongo文档中嵌套字段的数据类型?

    我的 Mongo 结构如下 topProcesses cpuUtilizationPercent 0 0 processId 1 memoryUtilizationPercent 0 1 command init user root cpu
  • Firefox 中保存的密码发送空字段

    我在保存浏览器凭据时遇到问题 我第一次使用应用程序登录时 浏览器要求我保存字段 我按 确定 但是当我第二次登录并且浏览器使用保存的凭据填写表单字段时 我按登录 浏览器发送不带参数的请求 HTML div div
  • 如何使用所有处理器在 MPI 中发送/接收

    该程序使用 C Lagrange 和 MPI 编写 我是 MPI 新手 想要使用所有处理器进行一些计算 包括进程 0 为了学习这个概念 我编写了以下简单程序 但是这个程序在接收到进程0的输入后挂在底部 并且不会将结果发送回进程0 inclu
  • 通知图标在通知托盘上为白色

    我的通知托盘上的应用程序图标在 Android 5 上变成白色 我见过这个Android 5 Lollipop 中通知栏图标变白 https stackoverflow com questions 28387602 notification
  • 如何在 Windows 窗体应用程序中创建 Alt 快捷方式?

    我想为 Windows 窗体应用程序中的某些控件创建键盘快捷键 Example 注意带下划线的 F E V P B I have a label and a textbox control I d like to associate tha
  • 可以检测页面抓取吗?

    所以我刚刚创建了一个为我执行页面抓取的应用程序 并运行它 效果很好 我想知道是否有人能够弄清楚代码正在被页面抓取 无论他们是否为此目的编写了代码 我用java编写了代码 它几乎只是检查一行html代码 我想在向该程序添加更多代码之前我应该
  • CGContextClipToMask 返回空白图像

    我是石英新手 我有 2 个图像 一个背景和一个带有剪切形状的蒙版 我想将其放置在背景上以剪切出一部分 生成的图像应该是切口的形状 这是我的面具 中间的形状是 0 alpha 这是我的代码 UIView canvas sender super