通过UIActivityViewController分享PNG图片到Facebook Messenger总是失败

5

这是一个需要专业知识的专家问题。

使用UIActivityViewController,可以成功地将高质量无损PNG图像分享到许多共享平台,但Facebook Messenger除外,每次都会失败,提供的错误是“无法加载内容”。

在Facebook Messenger中,UIImagePNGRepresentation NSDataAnyObject都失败了,然而UIImage可以成功分享,但输出的图像似乎是JPG格式,低质量并且有损。

问题:

这是怎么回事,如何纠正?如何成功地将高质量无损PNG图像与UIActivityViewController一起分享到Facebook Messenger?

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

是否有替代NSDataAnyObject(以及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
@Codus,谢谢,但我认为你需要重新阅读问题。myImage输出的图像质量低且有损失。当与除Messenger之外的所有应用程序共享时,myImagePNG提供无损高质量的图像输出。我想要的是在与Messenger共享时也能获得无损高质量的图像输出,这就是我想做的。我希望像与所有其他应用程序共享时一样成功地使用myImagePNG - user4806509
我有同样的问题。只有在分享到Facebook Messenger时才会出现。你已经找到解决方案了吗? - codeDude
1
@codeDude 很抱歉回复晚了。不幸的是,我们没有找到解决方案。我已经接受了这个事实,即Facebook Messenger目前无法与iOS共享。分享时会出现失真的图像。如果这就是Facebook Messenger想要的,那么就只能得到失真的图像了。 :-) - user4806509
进一步说,@codeDude,关于一个相关的问题,这可能指向某种解决方案:https://dev59.com/2VcQ5IYBdhLWcg3wEPoK - user4806509
1
@user4806509 感谢您为这个问题提供了一些启示。嘿嘿,是啊,这是他们的损失...有损压缩的图像。 - codeDude
2个回答

1

控制 UIActivityController 共享内容的最佳方法不仅是将其编码为数据,而是将该数据写入临时 URL,然后将该 URL 传递给 UIActivityController。这样,您可以控制共享文件的标题,如果他们选择保存文件或将其 AirDrop 到某个地方,则这一点非常重要。如果只共享数据,您最终会得到一些随机的文件名。这适用于通过 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
    }

0

为了保持图像的质量,请尝试使用UIGraphicsBeginImageContextWithOptions()


1
谢谢。我已经使用UIGraphicsBeginImageContextWithOptions(),然后使用drawViewHierarchyInRect进行捕获。捕获的质量非常好。实际上,在分享时,Messenger出现了一些奇怪的问题。 - user4806509

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接