尝试在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