从原始数据到UIImagePNGRepresentation,步骤更少

时间:2016-11-28 08:37:49

标签: ios uiimage swift3 nsdata uiimagepngrepresentation

使用此代码,我从共享扩展中提取图像,然后将其写入我在应用程序组中创建的目录。

let content = self.extensionContext!.inputItems[0] as! NSExtensionItem

   let contentType = kUTTypeImage as String

      for attachment in content.attachments as! [NSItemProvider] {

         if attachment.hasItemConformingToTypeIdentifier(contentType) {

            attachment.loadItem(forTypeIdentifier: contentType, options: nil) { data, error in

            // from here
            if error == nil {

               let url = data as! NSURL
               let originalFileName = url.lastPathComponent

               if let imageData = NSData(contentsOf: url as URL) {

                  let img = UIImage(data:imageData as Data)

                  if let data = UIImagePNGRepresentation(img!) {
                     // write, etc.
                                    }

                                }
                            }

                        }

一切正常。

我想知道的是,是否可以减少某些代码:特别是在if error == nil之后,我:

  • 将数据投射到NSURL;
  • 使用NSURL获取NSData;
  • 使用NSData获取UIImage;
  • 使用UIImage获取UIImagePNGRepresentation;

除了避免创建imageData变量之外,还没有办法(安全地)用更少的步骤实现相同的目标吗?

1 个答案:

答案 0 :(得分:1)

首先,您需要使用原生DataURL代替NSData& NSURL如果您想在DocumentDirectory中编写文件,那么您可以直接使用该imageData,无需从中生成UIImage个对象,然后使用UIImagePNGRepresentation将其转换为数据。

if let url = data as? URL, error == nil {

    let originalFileName = url.lastPathComponent
    if let imageData = try? Data(contentsOf: data) {
        // write, etc.
        var destinationURL  = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        destinationURL.appendPathComponent("fileName.png")
        try? imageData.write(to: destinationURL)
    }
}