如何从UIImageView中删除边框/阴影?

时间:2017-05-26 20:23:54

标签: ios swift uiimageview

我使用 CIQRCodeGenerator CIFilter生成了二维码,效果非常好:

enter image description here

但是当我调整UIImageView的大小并再次生成时

  @IBAction func sizeSliderValueChanged(_ sender: UISlider) {
    qrImageView.transform = CGAffineTransform(scaleX: CGFloat(sender.value), y: CGFloat(sender.value))
  }

我有时会在图片周围出现一个奇怪的 Border / DropShadow

enter image description here

如何防止它一直出现或完全删除?

我不知道它是什么,一个边框,一个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
  }

3 个答案:

答案 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。尝试使用其他图像,我希望它能够正常工作!