如何解决尝试在iPhone相册中保存清晰的QR码图像
我想将生成的QR码保存在iPhone的相册中。
使用下面的代码,我设法保存了它,但是得到的图像质量却很模糊。
任何我都想如何保存屏幕上的图像。
数据管理器以生成QR码
import Foundation
import CoreImage.CIFilterBuiltins
import SwiftUI
import Combine
class Datamanager: ObservableObject {
let objectwillChange = PassthroughSubject<Void,Never>()
let context = CIContext()
let filter = CIFilter.qrCodeGenerator()
func generateQRCode(from string: String) -> UIImage {
let data = Data(string.utf8)
filter.setValue(data,forKey: "inputMessage")
if let outputimage = filter.outputimage {
if let cgimg = context.createCGImage(outputimage,from: outputimage.extent) {
return UIImage(cgImage: cgimg)
}
}
return UIImage(systemName: "xmark.circle") ?? UIImage()
}
func saveImage(image : UIImage) {
let imageSaver = ImageSaver()
imageSaver.writetoPhotoAlbum(image: image)
}
}
class ImageSaver: NSObject {
func writetoPhotoAlbum(image: UIImage) {
UIImageWritetoSavedPhotosAlbum(image,self,#selector(saveError),nil)
}
@objc func saveError(_ image: UIImage,didFinishSavingWithError error: Error?,contextInfo: UnsafeRawPointer) {
print("Save finished!")
}
}
主视图显示QR码并点击保存它
struct Scanner3: View {
var dm: Datamanager
var body: some View {
vstack {
Image(uiImage: dm.generateQRCode(from: "www.google.it"))
.interpolation(.none)
.resizable()
.scaledToFit()
.frame(width: 200,height: 200)
}
.onTapGesture {
self.dm.saveImage(image: self.dm.generateQRCode(from: "www.google.it"))
}
}
}
我保存在相册中的图像真的很模糊
谢谢
解决方法
您可以在将图像渲染到CGImage
之前尝试放大图像:
let scale: CGFloat = 4.0
let transform = CGAffineTransform(scaleX: scale,y: scale)
let outputImage = filter.outputImage?.samplingNearest().transformed(by: transform)
QR码生成器将生成包含信息所需的最小尺寸的图像。如果您希望更大,则需要扩大规模。
注意:samplingNearest
将确保图像在缩放过程中不会变得模糊。
生成的QR码将单个像素用于QR码中的每个点。因此,生成的图像分辨率很低,一条短消息大约为25 x 25像素。当图像放大显示时,它使用的缩放算法会使图像看起来模糊。
解决方案是首先通过应用转换来创建具有更高分辨率的图像:
let transform = CGAffineTransform(scaleX: 100,scaleY: 100)
此解决方案的详细说明如下: https://medium.com/@MedvedevTheDev/generating-basic-qr-codes-in-swift-63d7222aa011
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。