1

我的应用程序中有一些代码可以生成 QR 码并将其放大(我使用来自 Hackng with Swift 的此链接的代码参考。现在,我正在使用共享表允许用户将 qr 代码保存到他们的相机胶卷,它正在工作,但将图像保存为低分辨率,并且它保存到相机胶卷模糊(我假设如果通过其他方法共享它也会模糊)

这是我的共享表功能的代码:

struct ActivityView: UIViewControllerRepresentable {

    let activityItems: [Any]
    let applicationActivities: [UIActivity]?

    func makeUIViewController(context: UIViewControllerRepresentableContext<ActivityView>) -> UIActivityViewController {
        return UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)
    }

    func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext<ActivityView>) {

    }
}

这是我的视图结构中的代码:

.sheet(isPresented: $showShareSheet) {
                    ShareSheet(activityItems: [self.qrCodeImage])
                }

当图像保存到共享表时,是否有一个技巧可以删除图像上的插值,例如图像视图本身的 .interpolation(.none) ?

4

1 回答 1

2

您的问题是二维码图像实际上很小!就像真的很小:

Printing description of image:
<UIImage:0x60000202cc60 anonymous {23, 23}>

当你分享这张图片时,它的显示方式取决于显示它的程序或应用程序,据我所知,它不受你的应用程序的控制。


然而,

有一种方法可以让您在其他应用程序中使其“漂亮”,这就是将分辨率提高到更大的数量,以便在渲染时看起来具有“锐利”的像素。

这将如何实现?我想我有一个隐藏在旧代码某处的例子,我会深入研究它,看看是否能找到一个例子;)

编辑

我找到了代码:

extension UIImage {
    func resized(toWidth width: CGFloat) -> UIImage? {
        let canvasSize = CGSize(width: round(width), height: CGFloat(ceil(width/size.width * size.height)))
        UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale)
        defer { UIGraphicsEndImageContext() }
        let context = UIGraphicsGetCurrentContext();
        context?.interpolationQuality = .none
        // Set the quality level to use when rescaling
        draw(in: CGRect(origin: .zero, size: canvasSize))
        let r = UIGraphicsGetImageFromCurrentImageContext()
        return r
    }
}

诀窍是提供一种缩放图像的方法,但真正的魔力在第 7 行:

context?.interpolationQuality = .none

如果排除此行,您将获得模糊的图像,这是操作系统默认执行的操作,因为您通常不希望看到图像中的像素边缘。

你可以像这样使用这个扩展:

.sheet(isPresented: $showShareSheet) {
    ShareSheet(activityItems: [self.qrCodeImage.resized(toWidth: 512) ?? UIImage()])
}

但是,这可能会比必要的更频繁地调整图像大小。最好在生成它的相同函数中调整它的大小。

于 2020-07-21T22:08:17.010 回答