我使用 CIQRCodeGenerator CIFilter生成了二维码,效果非常好:
但是当我调整UIImageView的大小并再次生成时
@IBAction func sizeSliderValueChanged(_ sender: UISlider) {
qrImageView.transform = CGAffineTransform(scaleX: CGFloat(sender.value), y: CGFloat(sender.value))
}
我有时会在图片周围出现一个奇怪的 Border / DropShadow :
如何防止它一直出现或完全删除?
我不知道它是什么,一个边框,一个dropShadow或一个面具,因为我是Swift / iOS的新手。
提前致谢!
PS。我没有发布任何QR码生成代码,因为它很漂亮,可以在许多教程中找到,但如果你需要它,请告诉我
编辑:
code to generate the QR Code Image
private func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: String.Encoding.ascii)
guard let filter = CIFilter(name: "CIQRCodeGenerator") else {
return nil
}
filter.setValue(data, forKey: "inputMessage")
guard let qrEncodedImage = filter.outputImage else {
return nil
}
let scaleX = qrImageView.frame.size.width / qrEncodedImage.extent.size.width
let scaleY = qrImageView.frame.size.height / qrEncodedImage.extent.size.height
let transform = CGAffineTransform(scaleX: scaleX, y: scaleY )
if let outputImage = filter.outputImage?.applying(transform) {
return UIImage(ciImage: outputImage)
}
return nil
}
Code for button pressed
@IBAction func generateCodeButtonPressed(_ sender: CustomButton) {
if codeTextField.text == "" {
return
}
let newEncodedMessage = codeTextField.text!
let encodedImage: UIImage = generateQRCode(from: newEncodedMessage)!
qrImageView.image = encodedImage
qrImageView.transform = CGAffineTransform(scaleX: CGFloat(sizeSlider.value), y: CGFloat(sizeSlider.value))
qrImageView.layer.minificationFilter = kCAFilterNearest
qrImageView.layer.magnificationFilter = kCAFilterNearest
}
答案 0 :(得分:2)
如果没有用于为图像视图生成图像的代码,确实有点难以确定,但这看起来像是一个调整大小的神器 - 在QR代码的边缘之外,CIImage可能是黑色或透明的,并且当图像视图大小与图像的预期大小不匹配时,边缘变得模糊,图像在其边界外或图像视图的背景颜色开始流血。可以通过设置图像视图层来修复它缩小/放大过滤到“最近邻居”,如下所示:
imageView.layer.minificationFilter = kCAFilterNearest
imageView.layer.magnificationFilter = kCAFilterNearest
从查看您添加的代码更新 - 您当前正在调整图像大小两次,首先调用applying(transform)
,然后在图像视图本身上设置变换。我怀疑第一次调整大小是添加模糊度,我之前建议的缩小/放大滤镜无法修复。请尝试将generateQRCode
缩短为:
private func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: String.Encoding.ascii)
guard let filter = CIFilter(name: "CIQRCodeGenerator") else {
return nil
}
filter.setValue(data, forKey: "inputMessage")
if let qrEncodedImage = filter.outputImage {
return UIImage(cgImage: qrEncodedImage)
}
return nil
}
答案 1 :(得分:0)
我认为这里的问题是你尝试将其调整为"非正方形" (因为scaleX
并不总是与scaleY
相同),而QR码始终是正方形,因此双方应具有相同的比例因子,以获得非模糊图像。
类似的东西:
let scaleX = qrImageView.frame.size.width / qrEncodedImage.extent.size.width
let scaleY = qrImageView.frame.size.height / qrEncodedImage.extent.size.height
let scale = max(scaleX, scaleY)
let transform = CGAffineTransform(scaleX: scale, y: scale)
将确保您拥有"无边框/非模糊/平方" UIImage
。
答案 2 :(得分:-1)
我想问题是图像(png)文件不是你的UIImageView。尝试使用其他图像,我希望它能够正常工作!