Конвертировать Square UIImage в round UIIMage для использования с CAEmitterCell.contents - PullRequest
0 голосов
/ 27 июня 2018

У меня есть пользовательский компонент пользовательского интерфейса, который создает изображение круглого шара с несколькими надписями, наложенными поверх него.

Я делаю снимок компонента, используя следующее расширение UIView, которое я нашел здесь в StackOverflow.

Я беру полученный UIImage и использую его в CAEmitterCell.

Моя проблема в том, что снимок квадратный - мой круглый шарик на белом фоне. Мне бы хотелось, чтобы фон был четким, когда он испускается, но я не могу найти способ сделать это.

Можно ли как-нибудь изменить UIImage, чтобы сделать его углы прозрачными?

Спасибо.

extension UIView {

/// Create snapshot
///
/// - parameter rect: The `CGRect` of the portion of the view to return. If `nil` (or omitted),
///                   return snapshot of the whole view.
///
/// - returns: Returns `UIImage` of the specified portion of the view.

func snapshot(of rect: CGRect? = nil) -> UIImage? {
    // snapshot entire view

    UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
    drawHierarchy(in: bounds, afterScreenUpdates: true)
    let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    // if no `rect` provided, return image of whole view

    guard let image = wholeImage, let rect = rect else { return wholeImage }

    // otherwise, grab specified `rect` of image

    let scale = image.scale
    let scaledRect = CGRect(x: rect.origin.x * scale, y: rect.origin.y * scale, width: rect.size.width * scale, height: rect.size.height * scale)
    guard let cgImage = image.cgImage?.cropping(to: scaledRect) else { return nil }
    return UIImage(cgImage: cgImage, scale: scale, orientation: .up)
  }
}

1 Ответ

0 голосов
/ 27 июня 2018

После выяснения, как сформулировать мой вопрос здесь, я подумал о другом способе поиска своего ответа и нашел решение.

Кто-то опубликовал расширение, чтобы сделать белый фон прозрачным в ответ на предыдущий вопрос. Белый не работал для меня, но простое редактирование и изменение имени заставили расширение работать для черного фона вместо белого.

extension UIImage {
func imageByMakingBlackBackgroundTransparent() -> UIImage? {

    let image = UIImage(data: UIImageJPEGRepresentation(self, 1.0)!)!
    let rawImageRef: CGImage = image.cgImage!

    let colorMasking: [CGFloat] = [0, 0, 0, 0, 0, 0]
    UIGraphicsBeginImageContext(image.size);

    let maskedImageRef = rawImageRef.copy(maskingColorComponents: colorMasking)
    UIGraphicsGetCurrentContext()?.translateBy(x: 0.0,y: image.size.height)
    UIGraphicsGetCurrentContext()?.scaleBy(x: 1.0, y: -1.0)
    UIGraphicsGetCurrentContext()?.draw(maskedImageRef!, in: CGRect.init(x: 0, y: 0, width: image.size.width, height: image.size.height))
    let result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return result
    }
}

Мое изображение изначально было на белом фоне, но в важной части изображения также был белый. Я временно изменил свой фон на черный, сделал снимок, затем преобразовал черный в прозрачный, а затем снова изменил свой фон на белый.

Конечный результат - моя проблема исправлена. Спасибо всем, кто нашел время, чтобы прочитать или подумать об этой проблеме.

...