Получение маскированного слоя как UIImage на Swift поверх UIImageView - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь получить UIImage маски, которую я применил к UIImageView.

Я добавляю маску, используя UIBezierPath, и хочу, чтобы фактический маскированный слой обозначался UIImage, а не все изображение.Думайте об этом как обрезать.

Я обрезаю изображение, используя:

func cropImage() {
    shapeLayer.fillColor = UIColor.black.cgColor
    viewSource.imageView.layer.mask = shapeLayer
    viewSource.imageView.layer.masksToBounds = true

    UIGraphicsBeginImageContextWithOptions(viewSource.imageView.bounds.size, false, 1)
    viewSource.imageView.layer.render(in: UIGraphicsGetCurrentContext()!)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    self.completionObservable.onNext(newImage)
}

Это в конечном итоге дает мне замаскированное изображение поверх старых измерений (начальная ширина imageView ирост).Но я хочу иметь только маскированное изображение, исключая белый фон вокруг них.

Экраны выглядят так:

enter image description here

enter image description here

1 Ответ

0 голосов
/ 23 января 2019

Теперь я знаю, что вы имеете в виду.Вот ответ, просто обновите размер imageContext.

          UIGraphicsBeginImageContextWithOptions((shapeLayer.path?.boundingBoxOfPath)!.size, false, 1)

Если это не так просто, можете попробовать CIImage pipe для достижения.

    let context =  CIContext()
    let m1 = newImage?.cgImage
    let m = CIImage.init(cgImage: m1!)
    let bounds = imageView.layer.bounds
    let cgImage =   context.createCGImage(m, from: CGRect.init(x: 0, y: bounds.size.height, width: bounds.size.width, height: bounds.size.height))
    let newUIImage = UIImage.init(cgImage: cgImage!)

Возможно, вам потребуется настроить преобразование.

...