【问题标题】:UIImage not SavingUIImage 不保存
【发布时间】:2019-01-15 17:49:32
【问题描述】:

目前正在失去生活的意愿,试图弄清楚为什么这不起作用! 基本上我已经生成了一个二维码(Swift 4/Xcode 9)并将其显示在 UIImageView 中。我想保存这张图片,以便在应用程序其他地方的弹出视图中使用。 我生成二维码的代码如下:

func generateQRCode(from string: NSString) -> UIImage? {
    let data = string.data(using: String.Encoding.isoLatin1.rawValue, allowLossyConversion: false)
    if let filter = CIFilter(name: "CIQRCodeGenerator") {
        guard let colorFilter = CIFilter(name: "CIFalseColor") else { return nil }

        filter.setValue(data, forKey: "inputMessage")

        filter.setValue("H", forKey: "inputCorrectionLevel")
        colorFilter.setValue(filter.outputImage, forKey: "inputImage")
        colorFilter.setValue(CIColor(red: 255/255, green: 87/255, blue: 34/255, alpha: 1), forKey: "inputColor1") // Background ORANGE
        colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor0") // Foreground or the barcode WHITE
        guard let qrCodeImage = colorFilter.outputImage
            else {
                return nil
        }
        let scaleX = myQRCode.frame.size.width / qrCodeImage.extent.size.width
        let scaleY = myQRCode.frame.size.height / qrCodeImage.extent.size.height
        let transform = CGAffineTransform(scaleX: scaleX, y: scaleY)


        if let output = colorFilter.outputImage?.transformed(by: transform) {
            return UIImage(ciImage: output)
        }
    }
    return nil
}

然后我在 viewDidLoad 中运行以下代码来显示二维码图像:

let image = generateQRCode(from: jsonString)
    myImageView.image = image

然后我获取文档目录路径并尝试保存图像:

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]
}

func saveQRImage() {
    if let data = UIImagePNGRepresentation(myImageView.image!) {
        let filename = getDocumentsDirectory().appendingPathComponent("qrcode.png")
        try? data.write(to: filename)
        print(data)
    }
}

我尝试在 viewDidLoad 和按下按钮时调用 saveQRImage() 函数,但都没有保存图像。我在saveQRImage()中的第一个if let语句之后放置了一个断点,但发现它没有运行该函数。

我尝试声明一个名为 finishedQRCode 的空 UIImage 变量并说 finishedQRCode = myImageView.image 并在 saveQRImage() 函数中使用它,但这没有区别!

我做错了什么真的很简单吗?

任何帮助将不胜感激!

【问题讨论】:

  • 用 do-catch 块替换 try?。如果try 失败,将调用catch 块,您可以打印错误。
  • 我还不能给你一个确切的答案,因为我没有足够的信息。在运行generateQRCode 之后,该图像似乎为零。所以你需要在这个函数中添加一个断点并单步执行它。就个人而言,我会注释掉滤色器并尽可能基本地尝试它并确认它可以正常工作,然后重新添加滤色器,看看是否有区别。您还需要确保 JSON 字符串有效。你真的可以用 JSON 字符串制作二维码吗?我以为主要是 URL?
  • 见:stackoverflow.com/questions/11327921/qr-codes-limits。 JSON 数据在二维码中毫无用处
  • 感谢您的快速回复!我会尝试根据您的观点提供更多信息。 generateQRCode 函数似乎工作正常,因为我能够获得一个 UIImage 以显示在我的 UIImageView 中(即生成的 QR 码图像)。关于 JSON 字符串,二维码生成完美,没有任何问题。我刚刚用一个基本字符串尝试了这个过程,但仍然有同样的问题。
  • 如果生成了图像,那么为什么不将图像保存在数据库中呢?为什么是 DocumentsDirectory ? ..

标签: ios swift uiimage qr-code xcode9


【解决方案1】:

您无法从 ciimage 获取 UIImageJPEGRepresentationUIImagePNGRepresentation。您需要在新的上下文中重新绘制图像:

let size = CGSize(width: scaleX, height: scaleY)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
defer { UIGraphicsEndImageContext() }
UIImage(ciImage: output).draw(in: CGRect(origin: .zero, size: size))
if let qrcodeImage = UIGraphicsGetImageFromCurrentImageContext() {
   let imageData = UIImageJPEGRepresentation(qrcodeImage, 1)
}

【讨论】:

  • 非常感谢您的回答!但是我不确定如何将其实施到我的项目中?在return UIImage(ciImage: output) 之前,我已将它放在我的generateQRCode() 函数中,这是正确的吗?然后如何保存 imageData?
  • 只是 data.write(到 URL
  • 标记为答案。非常感谢您的帮助!
  • 图像在我的弹出图像视图中呈现时似乎很模糊。这是我现在必须玩的东西。
  • 您需要缩放图像,但看起来您已经应用了转换。确保你正在扩大规模
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多