我正在尝试进行图像 mask ,这是我的输出和代码。
这是我的 mask 引用图像(图像大小无关紧要),
mask .png,
这是我正在执行 mask 的图像,
imggo.png,
这是输出。
我正在使用 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/