【问题标题】:How to align a mask onto an image如何将蒙版对齐到图像上
【发布时间】:2014-12-31 00:26:02
【问题描述】:

我正在用 Swift 编写代码,尝试使用 UIImage 和 CALayer 屏蔽图像。问题是蒙版在应用于图像时会被缩放和移动。我使用 Interface Builder 创建了 UIImageViewer,并将其设置为 Aspect Fit。我想屏蔽任意大小的图像。我生成的蒙版图像与图像大小相同。这是一个要求,因为稍后我想以编程方式向我的蒙版添加更多元素,并且它必须覆盖蒙版图像。这是我的代码:

class ViewController: UIViewController {

@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    var img = UIImage(named: "flowers.png")

    var maskImageSize = CGSizeMake(img!.size.width, img!.size.height)

    UIGraphicsBeginImageContextWithOptions(maskImageSize, false, 0.0)

    var color = UIColor(white: 1.0, alpha: 0.0)
    color.setFill()
    var rect = CGRectMake(0, 0, img!.size.width, img!.size.height)
    UIRectFill(rect)

    color = UIColor(white: 0.0, alpha: 1.0)
    color.setFill()
    rect = CGRectMake((img!.size.width/2)-50, (img!.size.height/2)-50, 100, 100)
    UIRectFill(rect)

    var maskImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    var maskLayer = CALayer()
    maskLayer.frame = self.imageView.layer.bounds // it'll have the same problem if I set it to self.imageView.layer.frame
    maskLayer.contents = maskImage.CGImage
    maskLayer.contentsGravity = kCAGravityCenter

    self.imageView.image = img
    self.imageView.layer.mask = maskLayer;
    self.imageView.layer.masksToBounds = true
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

我需要知道如何将图像蒙版与原始图像对齐。感谢您的帮助!

我有很好的屏幕截图,但 Stackoverflow 不允许我发布它们,因为我没有足够的声誉!

【问题讨论】:

  • 将屏幕截图发布到其他地方,例如 imgur,并添加指向您问题的链接。有人(呵呵)会过来把实际的图片放到你的问题中。
  • 这里是我的蒙版图像、原始图像和结果图像的链接:imgur.com/IPXwkESimgur.com/jip5PWcimgur.com/0QPtcOW谢谢马特!

标签: swift uiimage calayer masking


【解决方案1】:

这里的问题是,如果您使用宽高比匹配,那么显示的图像大小取决于原始图像的大小和图像视图的大小。您正在尝试做的是模仿图像视图对图像的作用 - 而您无法确切知道那是什么。

你能做的最好的就是猜测。您正在寻找的是最大矩形的大小,它将适合您的图像视图的边界,同时保持原始图像的纵横比。碰巧,如果您导入 AV Foundation 框架,有一个方便的函数可以为您提供该信息,AVMakeRectWithAspectRatioInsideRect(记录在此:https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVFoundation_Functions/index.html#//apple_ref/c/func/AVMakeRectWithAspectRatioInsideRect)。

【讨论】:

  • 谢谢!我会检查的。这份工作比我想象的要艰难。
  • 我想如果我将图像蒙版设置为与原始图像相同的大小,那么无论通过宽高比拟合参数对原始图像发生的任何影响都会发生在蒙版图像上!
  • 没有。想想看。蒙版是图像view 的一层。这不是正在变得适合方面的东西。 image 是适合方面的。 UIImageView 不是 UIImage。
  • 还有 5 天才能完成项目,现在是新的一年,我不得不重新考虑我的问题 :) 谢谢 matt,新年快乐!
  • 就我个人而言,我什至还没有理解您真正想要做什么。所有这些关于蒙版的讨论...我只在谈论蒙版和纵横比,因为正在谈论它们。如果我知道您的真正目标是什么,也许我可以推荐一种完全不同的方式。但是在你的问题中,你从来没有说(尽管我已经问过你)你实际上想要做什么。
【解决方案2】:

我也遇到了同样的问题,我在 UIImageView 的实用程序中修复了它。在 drawing 部分,我只检查 clip Subview 像这样

问题解决了!

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多