【问题标题】:Sharing PNG image with UIActivityViewController to Facebook Messenger always fails使用 UIActivityViewController 向 Facebook Messenger 共享 PNG 图像总是失败
【发布时间】:2017-07-19 01:09:41
【问题描述】:

这是一个具有专业知识的专家的问题。

可以将PNG 和UIActivityViewController 的高质量无损图片成功分享到许多分享平台,但每次都失败的Facebook Messenger 除外。提供的错误是“Couldn’t Load Content”。

UIImagePNGRepresentation NSData 和 AnyObject 在 Facebook Messenger 中均失败,UIImage 但是成功共享但是输出的图像似乎是 JPG 并且质量低且有损。 p>

问题:

这里发生了什么以及如何纠正 - 我如何才能成功地将带有UIActivityViewController 的高质量无损 PNG 图像分享到 Facebook Messenger?

这是 Facebook Messenger、Xcode 或 UIActivityViewController 的问题或限制吗?

除了NSData 和AnyObject(和UIImage)还有其他可行的方法吗?

代码:

var myImage: UIImage! 
var myImagePNG: NSData! 
//var myImagePNG: AnyObject!

func sharePNG() { …
    myImagePNG = UIImagePNGRepresentation(myImage)!
    let activity = UIActivityViewController(activityItems: [myImagePNG], applicationActivities: nil)
    self.presentViewController(activity, animated: true, completion: nil)
}

图片:

【问题讨论】:

  • 你想做什么?你应该使用myImage而不是myImagePNG。
  • @Codus,谢谢,但我认为您需要重新阅读该问题。 myImage 提供有损低质量图像输出。 myImagePNG 在与除失败的 Messenger 之外的所有应用程序共享时提供无损的高质量图像输出。我在分享到 Messenger 时追求无损的高质量图像输出,这就是我想要做的。我想使用myImagePNG,就像我在与所有其他应用程序共享时一样成功。
  • 我也有同样的问题。仅在共享到 Facebook Messenger 时发生。您已经找到解决方案了吗?
  • @codeDude 抱歉延迟回复。不幸的是,没有,没有找到解决方案。我接受了 Facebook Messenger 目前不支持 iOS 共享的事实。共享时会保留有损图像。如果这就是 Facebook Messenger 想要的,那就是 Facebook Messenger 得到的,有损图像。 :-)
  • @user4806509 感谢您对此事有所了解。呵呵,是的,这是他们的损失....有损图像

标签: ios swift xcode uiactivityviewcontroller messenger


【解决方案1】:

更好地控制从 UIActivityController 共享的内容的最佳方法不仅仅是将其编码为数据,而是将该数据写入临时 URL,然后将 URL 传递给 UIActivityController。这样您就可以控制共享文件的标题,如果他们选择将文件保存或空投到某处,这一点很重要。如果您只是共享数据,您最终会得到一些非常随机的文件名。这适用于通过 Facebook Messenger 发送 PNG:

    enum ImageProcessingError: Error {
        case couldNotCreatePNGData
    }
    
    private func exportImageAsPNG(_ image: UIImage, filename: String) throws {
        guard let pngData = image.pngData() else { throw ImageProcessingError.couldNotCreatePNGData }
        let temporaryURL = FileManager.default.temporaryDirectory
            .appendingPathComponent(filename)
            .appendingPathExtension("png")
        try pngData.write(to: temporaryURL, options: [])
        // present UIActivityViewController with the temporaryURL
    }

【讨论】:

    【解决方案2】:

    要保持图像质量,请尝试使用UIGraphicsBeginImageContextWithOptions()

    【讨论】:

    • 谢谢。我已经使用UIGraphicsBeginImageContextWithOptions() 然后drawViewHierarchyInRect 来捕获。捕捉是完美的质量。当 Messenger 出现问题时,它实际上是在分享的时候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多