UIImage 不保存
UIImage not Saving
目前正在失去生存的意愿,试图弄清楚为什么这不起作用!
基本上我已经生成了一个二维码 (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 语句之后放置了一个断点,但发现它不是 运行ning 函数。
我曾尝试声明一个名为 finishedQRCode
的空 UIImage 变量并声明 finishedQRCode = myImageView.image
并在 saveQRImage()
函数中使用它,但这没有区别!
我做错了什么非常简单的事情吗?
任何帮助将不胜感激!
您无法从 ciimage 中获取 UIImageJPEGRepresentation
或 UIImagePNGRepresentation
。您需要在新的上下文中重新绘制图像:
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)
}
目前正在失去生存的意愿,试图弄清楚为什么这不起作用! 基本上我已经生成了一个二维码 (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 语句之后放置了一个断点,但发现它不是 运行ning 函数。
我曾尝试声明一个名为 finishedQRCode
的空 UIImage 变量并声明 finishedQRCode = myImageView.image
并在 saveQRImage()
函数中使用它,但这没有区别!
我做错了什么非常简单的事情吗?
任何帮助将不胜感激!
您无法从 ciimage 中获取 UIImageJPEGRepresentation
或 UIImagePNGRepresentation
。您需要在新的上下文中重新绘制图像:
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)
}