图像蒙版工作不正常,输出图像是黑白的,应该是彩色的

时间:2015-01-06 13:31:51

标签: ios swift core-graphics

我尝试在此处进行图像屏蔽是我的输出和代码。

这是我的掩蔽参考图像(图像大小并不重要),

mask.png,

Masking Image

这是我正在执行屏蔽的图像,

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)!

}

所以,我怎么能去!图像丰富多彩。? 有人会提供代码。

1 个答案:

答案 0 :(得分:2)

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

maskImage函数希望首先屏蔽图像,然后屏蔽。但是当你打电话给maskImage(maskRefImg!, maskImage: maskImg!)时,你会完全交换它。

因此您需要致电maskImage(maskImg!, maskImage: maskRefImg!)


我猜你想要的是倾斜的矩形,上面带有" Go!"并且结果图像应与掩模图像完全相同。

当您交换图像时(如您所愿),将蒙版图像缩放到" Go!"图片尺寸。但相反,您可能希望遮罩图像居中于" Go!"图片。所以你需要create a new image与你的" Go!"相同的大小。图像并将蒙版绘制在该临时图像的中心。然后使用临时图像作为要应用的实际蒙版。

交换参数时的示例图像也显示"外部"也是绿色的。这可能是因为您的蒙版图像在那里是透明的,CGImageMaskCreate将其转换为黑色。但是documentation of CGImageCreateWithMask基本上告诉你创建的图像将混合" Go!"图像,以便你的面具图像是黑色的部分将有" Go!"图像可见,并且您的蒙版图像是白色的,它将是透明的。

因此,逐步说明是:

  • 创建一个与输入图像大小相同的新临时图像(" Go!"图像)。
  • 用白色填充。
  • 将您的蒙版图像绘制在临时图像的中心。
  • 通过使用临时图像调用CGImageMaskCreate来创建实际掩码。
  • 使用" Go!"拨打CGImageCreateWithMask作为第一个参数的图像和我们刚刚创建的第二个参数的实际掩码。
  • 结果可能太大(围绕它有很多透明度)。如果您不想要裁剪结果图像(例如,缩小到原始蒙版图像的大小;请务必裁剪到中心)。

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