Использование исходного отчета CIImage EXC_BAD_INSTRUCTION ошибка в расширении - swift

Прежде чем задать этот вопрос, я искал соответствующий пост:

"нераспознанный селектор" при попытке доступа к outputImage CIFilter

Я не знаю, если это из-за использования swift или же extension, Я получу error, Я проверил два methods чтобы получить CIImage, но не в EXC_BAD_INSTRUCTION:

Внимание
мой url не является http:// префикс, но weixin://wxpay/bizpayurl?pr=ZwBVaW0и я думаю это не причина ошибки.

1) Способ первый:

extension String {

    func initQRImage() ->UIImage {

        let filter:CIFilter = CIFilter.init(name: "CIQRCodeGenerator")!
        filter.setDefaults()
        let data:Data = self.data(using: String.Encoding.utf8)!
        filter.setValue(data, forKey: "inputMessage")
        let outputImage:CGImage = filter.outputImage as! CGImage // EXC_BAD_INSTRUCTION here
        let qr_image = UIImage.init(cgImage: outputImage)

        return qr_image
    }
}

2) Способ второй:

extension String {

    func initQRImage() ->UIImage {

        let url:URL = URL.init(fileURLWithPath: self)
        let inputImage:CIImage = CIImage.init(contentsOf: url)!  // EXC_BAD_INSTRUCTION here
        let filter: CIFilter = CIFilter.init(name: "CIAreaAverage")!
        filter.setValue(inputImage, forKey: kCIInputImageKey)
        let inputExtent:CGRect = inputImage.extent
        let extent:CIVector = CIVector.init(x: inputExtent.origin.x, y: inputExtent.origin.y, z: inputExtent.size.width, w: inputExtent.size.height)
        filter.setValue(extent, forKey: kCIInputExtentKey)
        let outputImage:CIImage = filter.value(forKey: "outputImage") as! CIImage

        let qr_image = UIImage.init(cgImage: outputImage as! CGImage)
        return qr_image
    }
}

Два метода сообщат EXC_BAD_INSTRUCTION ошибка здесь, вы можете увидеть annotation Я пишу после сообщения об ошибке в строке.


РЕДАКТИРОВАТЬ - 1

Я попытался в моем проекте снова, не используя extension, Здесь error тоже и data не является nil:

ошибка здесь

2 ответа

Решение

Наконец, я нашел устаревший метод для генерации QR codeпосле моего улучшения становится так:

// quality can modify the defintion
class func generateQRImage(stringQR:NSString, withSizeRate rate:CGFloat, quality:CGFloat?) -> UIImage
{
    let filter:CIFilter = CIFilter(name:"CIQRCodeGenerator")!
    filter.setDefaults()

    let data:NSData = stringQR.data(using: String.Encoding.utf8.rawValue)! as NSData
    filter.setValue(data, forKey: "inputMessage")

    let outputImg:CIImage = filter.outputImage!

    let context:CIContext = CIContext(options: nil)

    var tmp_quality = quality

    if quality == nil {

        tmp_quality = 1.0
    }

    let transform: CGAffineTransform  = CGAffineTransform(scaleX: tmp_quality!, y: tmp_quality!);
    let outputImg_after = outputImg.applying(transform)

    let cgimg:CGImage = context.createCGImage(outputImg_after, from: outputImg_after.extent)!

    var img:UIImage = UIImage(cgImage: cgimg, scale: 1.0, orientation: UIImageOrientation.up)

    let width  = img.size.width * rate
    let height = img.size.height * rate

    UIGraphicsBeginImageContext(CGSize.init(width: width, height: height))
    let cgContxt:CGContext = UIGraphicsGetCurrentContext()!
    cgContxt.interpolationQuality = .high // cgContxt kCGInterpolationNone
    img.draw(in: CGRect.init(x: 0, y: 0, width: width, height: height))  // (0, 0, width, height)
    img = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return img
}

Я думаю, что данные nil,

let data:Data = self.data(using: String.Encoding.utf8)!

Также UIImage созданный с CIImage не имеет растрового изображения, у него нет реального изображения, это просто набор инструкций для применения фильтра. Таким образом, ваши методы для преобразования в UIImage не должны работать.

Другие вопросы по тегам