在iOS中截取带有标签和透明背景的视图并将其上传到服务器

Posted

技术标签:

【中文标题】在iOS中截取带有标签和透明背景的视图并将其上传到服务器【英文标题】:Screenshot a view with label and transparent background in iOS and upload it to server 【发布时间】:2018-10-03 08:50:18 【问题描述】:

我想截取一个视​​图并从中创建一个 UIImage。我希望在我的图像中保持视图的透明度属性。我在创建 UIImage 的扩展后尝试了此方法,但上传到服务器时生成的图像中的背景不透明。

如果我做错了什么,请帮助或指出我!这意味着生成的 png 没有透明度。

class func createTransparentImageFrom(label: UILabel, imageSize: CGSize) -> UIImage 
    UIGraphicsBeginImageContextWithOptions(imageSize, false, 2.0)
    let currentView = UIView.init(frame: CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
    currentView.backgroundColor = UIColor.clear
    currentView.addSubview(label)

    currentView.layer.render(in: UIGraphicsGetCurrentContext()!)
    let img = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return img!

【问题讨论】:

【参考方案1】:

Swift 5 UIImage 扩展:具有透明背景的屏幕 UIView

这是为了截取一个应该有.backgroundColor = .clear的视图

extension UIView 

    func takeSnapshotOfView() -> UIImage? 

        let size = CGSize(width: frame.size.width, height: frame.size.height)
        let rect = CGRect.init(origin: .init(x: 0, y: 0), size: frame.size)

        UIGraphicsBeginImageContext(size)
        drawHierarchy(in: rect, afterScreenUpdates: true)

        let image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        guard let imageData = image?.pngData() else 
           return nil
        

        return UIImage.init(data: imageData)
    


【讨论】:

【参考方案2】:

这是因为我们渲染视图的时候图片是JPEG/JPG,所以我们需要把它转成png来获取图层信息。

试试这个:

extension UIImage 
 class func createTransparentPNGFrom(label: UILabel, imageSize: CGSize) -> UIImage? 
    UIGraphicsBeginImageContextWithOptions(imageSize, false, 0)
    let currentView = UIView.init(frame: CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
    currentView.backgroundColor = UIColor.clear
    currentView.addSubview(label)
    currentView.layer.render(in: UIGraphicsGetCurrentContext()!)
    let img = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    guard let newImg = img else 
        return nil
    
    guard let imageData = UIImagePNGRepresentation(newImg) else 
        return nil
    
    return UIImage.init(data: imageData)
 

【讨论】:

【参考方案3】:

您需要将 opaque 值设置为 true 以获得透明结果 UIView 的透明截图的扩展

func screenShot() -> UIImage? 
     UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, UIScreen.main.scale)
     self.layer.render(in: UIGraphicsGetCurrentContext()!)
     let img = UIGraphicsGetImageFromCurrentImageContext()
     UIGraphicsEndImageContext()
     return img
 

【讨论】:

你能帮我做一个演示应用吗?我在图像中得到黑色背景

以上是关于在iOS中截取带有标签和透明背景的视图并将其上传到服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将其添加到子视图的情况下截取 uiview?

带有非透明子视图的 iOS 8 透明视图

IOS - 将背景图像缩放到不同的屏幕尺寸并将标签放在固定位置上

iOS UITableViewCell点击时子视图背景透明的解决方法

iOS - 半透明模态视图控制器

视图控制器透明背景