ios - 图像 mask 工作不正常,输出图像是黑白的,应该是彩色的

标签 ios swift core-graphics

我正在尝试进行图像 mask ,这是我的输出和代码。

这是我的 mask 引用图像(图像大小无关紧要),

mask .png,

Masking Image

这是我正在执行 mask 的图像,

imggo.png,

Image on which masking is performed (Here the image size doesn't matter)

这是输出

Output

我正在使用 Swift,这是我的代码...

override func viewDidLoad() {
    super.viewDidLoad()

    var maskRefImg : UIImage? = UIImage(named: "mask.png")
    var maskImg :UIImage? = UIImage(named: "imggo.png")

    var imgView: UIImageView? = UIImageView(frame: CGRectMake(20, 50, 99, 99))
    imgView?.image = maskImage(maskRefImg!, maskImage: maskImg!)


self.view.addSubview(imgView!)
}


func maskImage(image:UIImage,maskImage:UIImage)-> UIImage{

    var maskRef:CGImageRef = maskImage.CGImage

    var mask:CGImageRef = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), nil, true)

    var masked:CGImageRef = CGImageCreateWithMask(image.CGImage, mask)


return UIImage(CGImage: masked)!

}

那么,我怎样才能让 Go!图像色彩丰富。? 谁能提供代码。?

最佳答案

您正在使用错误的参数顺序调用函数 maskImage:

maskImage 函数希望图像先 mask ,然后再 mask 。但是,当您调用 maskImage(maskRefImg!, maskImage: maskImg!) 时,您就完全交换了它。

所以你需要调用maskImage(maskImg!, maskImage: maskRefImg!)


我猜您想要的是带有“Go!”字样的倾斜矩形。并且结果图像的大小应与蒙版图像的大小完全相同。

当您交换图像时(必须这样做),蒙版图像会缩放到“开始!”图片大小。但是相反,您可能希望 mask 图像以您的“开始!”为中心。图像。所以你需要 create a new image与您的“Go!”大小相同图像并将蒙版绘制到该临时图像的中心。然后,您将临时图像用作要应用的实际 mask 。

交换参数时的示例图像还显示“外部”也是绿色的。这可能是因为您的蒙版图像在那里是透明的,CGImageMaskCreate 将其转换为黑色。但是 documentation of CGImageCreateWithMask基本上告诉您创建的图像将融合“Go!”图像,以便您的蒙版图像为黑色的部分将具有“开始!”图像可见,蒙版图像为白色的地方将是透明的。

因此,分步说明是:

  • 创建一个与输入图像(“Go!”图像)大小相同的新临时图像。
  • 用白色填充它。
  • 在临时图像的中心绘制您的蒙版图像。
  • 通过使用临时图像调用 CGImageMaskCreate 创建实际掩码。
  • 使用“开始!”调用 CGImageCreateWithMask图像作为第一个参数,我们刚刚创建的实际掩码作为第二个参数。
  • 结果可能太大(周围有很多透明度)。如果您不想这样,则需要裁剪结果图像(例如,裁剪到原始蒙版图像的大小;确保裁剪到中心)。

如果您立即在 DeviceGray 颜色空间中创建临时图像,您可以跳过 CGImageCreateWithMask 部分,因为 CGImageCreateWithMask 希望第二个参数是这种颜色的图像空间。在这种情况下,我建议您修改 mask.png,使其不包含任何透明度:现在透明的地方应该是白色。

关于ios - 图像 mask 工作不正常,输出图像是黑白的,应该是彩色的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27799754/

相关文章:

javascript - 全屏不适用于 Iphone 6s 和 5s

ios - 核心数据获取概念

ios - 如何从数组元素中删除括号

ios - 类型 'GKEntity' 的值没有成员 'componentForClass' 。为什么我在 swift 3.0 中找不到这个方法?

iphone - 在 Core Graphics 中创建拼贴的多个剪切矩形

objective-c - 重用 CGContext 导致奇怪的性能损失

ios - EXC_BAD_ACCESS 在使用它评估 NSExpression 后更新 Swift 字典时

ios - UIBarButtonItem 在水平滚动下不显示

swift - 在 Swift 中,如何创建 String 的后代?我在尝试这样做时收到错误 "Inheritance from non-protocol, non-class type ' String'"

iphone - 将 UIImage 用于 CGContextSetFillColorWithColor 时突然出现内存峰值