Как преобразовать просмотр (не отображаемый) в изображение JPEG? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть этот код для преобразования представления в изображение. Но я хочу, чтобы мое изображение было в формате jpeg. Какие изменения мне нужно сделать в этом коде, чтобы получить мое изображение в формате JPEG. Я не показываю свое изображение на устройстве.

extension UIView{
    func createTransparentImage() -> UIImage {
        let renderFormat = UIGraphicsImageRendererFormat.default()
        renderFormat.opaque = false
        self.isOpaque = false
        self.layer.isOpaque = true
        self.backgroundColor = UIColor.clear
        self.layer.backgroundColor = UIColor.clear.cgColor
        let renderer = UIGraphicsImageRenderer(size: bounds.size, format: renderFormat)
        return renderer.image{
            (context) in
            layer.render(in: context.cgContext)
        }
    }  
}

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Итак, с вашим расширением вы получите UIImage, если хотите, вы можете сохранить его как JPEG или PNG, преобразовав его в Data или NSData в Objective C:

let viewSnapshot = view.createTransparentImage()
//save as JPEG
if let data = viewSnapshot.jpegData(compressionQuality: 0.8) {
    //variable data has the JPEG image with quality of 80%
}
//save as PNG 
if let data = viewSnapshot.pngData() {
    //variable data has the PNG data of the snapshot
}

Если вы хотите сохранить это изображение, вы можете просто сделать следующее внутри if let data

let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let documentsDirectory = paths.first {
    let fileName = documentsDirectory.appendingPathComponent("myImage.jpg")
    try? data.write(to: fileName)   
}

Учитывая, что вам не нужен UIImage, а только JPEG data просто сделайте небольшие изменения в своем расширении следующим образом:

extension UIView{
    func createImageData(quality: CGFloat = 0.8) -> Data {
        let renderFormat = UIGraphicsImageRendererFormat.default()
        renderFormat.opaque = false
        self.isOpaque = false
        self.layer.isOpaque = true
        self.backgroundColor = UIColor.clear
        self.layer.backgroundColor = UIColor.clear.cgColor
        let renderer = UIGraphicsImageRenderer(size: bounds.size, format: renderFormat)
        return renderer.jpegData(withCompressionQuality: quality, actions: { context in
            layer.render(in: context.cgContext)
        })
    }
}

Обратите внимание, что последняя строка была изменена на:

return renderer.jpegData(withCompressionQuality: quality, actions: { context in

Таким образом, чтобы использовать это, вы можете просто сделать:

let viewSnapshotData = view.createImageData(quality: 0.9)

Согласно LeoDabus вы можете использовать следующее расширение для получения снимка UIView с альфа-прозрачностью, если это необходимо:

extension UIView {
    var snapshot: UIImage {
        isOpaque = false
        backgroundColor = .clear
        let format = UIGraphicsImageRendererFormat.default()
        format.opaque = false
        return UIGraphicsImageRenderer(size: bounds.size, format: format).image { _ in 
            drawHierarchy(in: bounds, afterScreenUpdates: true)
        }
    }
}
1 голос
/ 05 мая 2020
extension UIView{
func captureViewAsImage() -> UIImage? {
    var screenshotImage :UIImage?
    let layer = self.layer
    UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, UIScreen.main.scale);
    guard let context = UIGraphicsGetCurrentContext() else {return nil}
    layer.render(in:context)
    screenshotImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return screenshotImage
  }
}

и используйте эту функцию как

 let img = view.captureViewAsImage()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...