Ios swift生成背景透明的二维码
在我的swift 2应用程序中,我可以生成如下二维码:Ios swift生成背景透明的二维码,ios,swift,Ios,Swift,在我的swift 2应用程序中,我可以生成如下二维码: let data = "1234567890".dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false) let filter = CIFilter(name: "CIQRCodeGenerator") filter!.setValue(data, forKey: "inputMessage") filter!.setValue("Q", forKey
let data = "1234567890".dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter!.setValue(data, forKey: "inputMessage")
filter!.setValue("Q", forKey: "inputCorrectionLevel")
qrcodeImage = filter!.outputImage
let transformedImage = qrcodeImage.imageByApplyingTransform(CGAffineTransformMakeScale(150, 150))
QRCodeImage.image = UIImage(CIImage: transformedImage)
QRCodeImage.backgroundColor = UIColor.clearColor()
QRCodeImage.backgroundcolor = UIColor(white: 1, alpha: 0.5)
let myChosenColor = UIColor(red:0.93, green:0.31, blue:0.23, alpha:1.00)
let qrURLImage = URL(string: "https://stackoverflow.com")?.qrImage(using: myChosenColor)
myQrImageView.image = qrURLImage
但是我的二维码有一个白色的背景图像,但我希望有一个透明的背景
我试过这样的方法:
let data = "1234567890".dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter!.setValue(data, forKey: "inputMessage")
filter!.setValue("Q", forKey: "inputCorrectionLevel")
qrcodeImage = filter!.outputImage
let transformedImage = qrcodeImage.imageByApplyingTransform(CGAffineTransformMakeScale(150, 150))
QRCodeImage.image = UIImage(CIImage: transformedImage)
QRCodeImage.backgroundColor = UIColor.clearColor()
QRCodeImage.backgroundcolor = UIColor(white: 1, alpha: 0.5)
let myChosenColor = UIColor(red:0.93, green:0.31, blue:0.23, alpha:1.00)
let qrURLImage = URL(string: "https://stackoverflow.com")?.qrImage(using: myChosenColor)
myQrImageView.image = qrURLImage
但这不起作用。
有什么想法吗?:) 似乎CIQRCodeGenerator过滤器总是使用黑白 您可以将输出传递到过滤器以将其转换为透明:
首先,您可能需要使用来交换黑白。我认为关键点将位于背景的alpha上。您可以设置或减少alpha,减少或删除透明度。试着这样做:
let data = "1234567890".dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter!.setValue(data, forKey: "inputMessage")
filter!.setValue("Q", forKey: "inputCorrectionLevel")
qrcodeImage = filter!.outputImage
let transformedImage = qrcodeImage.imageByApplyingTransform(CGAffineTransformMakeScale(150, 150))
QRCodeImage.image = UIImage(CIImage: transformedImage)
QRCodeImage.backgroundColor = UIColor.clearColor()
QRCodeImage.backgroundcolor = UIColor(white: 1, alpha: 0.5)
let myChosenColor = UIColor(red:0.93, green:0.31, blue:0.23, alpha:1.00)
let qrURLImage = URL(string: "https://stackoverflow.com")?.qrImage(using: myChosenColor)
myQrImageView.image = qrURLImage
希望有帮助。对于透明背景,你应该(运用你的直觉)这样做
//Create a CIFalseColor Filter
let colorFilter: CIFilter = CIFilter(name: "CIFalseColor")!
colorFilter.setDefaults()
colorFilter.setValue(yourQRFilter.outputImage!, forKey: "inputImage")
//Then set the background colour like this,
let transparentBG: CIColor = CIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
colorFilter.setValue(qrColor, forKey: "inputColor0")
colorFilter.setValue(transparentBG, forKey: "inputColor1")
outputImage = colorFilter.outputImage!
我希望这会给您提供透明背景的QRCode图像。这是我的代码:
func QRImageFromData(_ data: Data) -> UIImage? {
let filter = CIFilter(name: "CIQRCodeGenerator")
filter?.setValue(data, forKey: "inputMessage")
//filter?.setValue("H", forKey: "inputCorrectionLevel")
//change qrcode color : #1e3259
let filterFalseColor = CIFilter(name: "CIFalseColor")
filterFalseColor?.setDefaults()
filterFalseColor?.setValue(filter?.outputImage, forKey: "inputImage")
// convert method
let cgColor: CGColor? = UIColor(hex: "#1e3259")?.cgColor
let qrColor: CIColor = CIColor(cgColor: cgColor!)
let transparentBG: CIColor = CIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
filterFalseColor?.setValue(qrColor, forKey: "inputColor0")
filterFalseColor?.setValue(transparentBG, forKey: "inputColor1")
if let image = filterFalseColor?.outputImage {
let transform = CGAffineTransform(scaleX: 5.0, y: 5.0)
return UIImage(ciImage: image.applying(transform),
scale: 1.0,
orientation: UIImageOrientation.up)
} else {
return nil
}
}
我获得了一个透明背景的qr 添加以下扩展:
extension CIImage {
/// Inverts the colors and creates a transparent image by converting the mask to alpha.
/// Input image should be black and white.
var transparent: CIImage? {
return inverted?.blackTransparent
}
/// Inverts the colors.
var inverted: CIImage? {
guard let invertedColorFilter = CIFilter(name: "CIColorInvert") else { return nil }
invertedColorFilter.setValue(self, forKey: "inputImage")
return invertedColorFilter.outputImage
}
/// Converts all black to transparent.
var blackTransparent: CIImage? {
guard let blackTransparentFilter = CIFilter(name: "CIMaskToAlpha") else { return nil }
blackTransparentFilter.setValue(self, forKey: "inputImage")
return blackTransparentFilter.outputImage
}
/// Applies the given color as a tint color.
func tinted(using color: UIColor) -> CIImage?
{
guard
let transparentQRImage = transparent,
let filter = CIFilter(name: "CIMultiplyCompositing"),
let colorFilter = CIFilter(name: "CIConstantColorGenerator") else { return nil }
let ciColor = CIColor(color: color)
colorFilter.setValue(ciColor, forKey: kCIInputColorKey)
let colorImage = colorFilter.outputImage
filter.setValue(colorImage, forKey: kCIInputImageKey)
filter.setValue(transparentQRImage, forKey: kCIInputBackgroundImageKey)
return filter.outputImage!
}
}
extension URL {
func qrImage(using color: UIColor) -> UIImage? {
let ciImage = qrCIImage?.tinted(using: color)
return ciImage != nil ? UIImage(ciImage: ciImage!) : nil
}
var qrImage: UIImage? {
return UIImage(ciImage: qrCIImage!)
}
/// Creates a QR code for the current URL in the given color.
func qrCIImage(using color: UIColor) -> CIImage? {
return qrCIImage?.tinted(using: color)
}
/// Returns a black and white QR code for this URL.
var qrCIImage: CIImage? {
guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return nil }
let qrData = absoluteString.data(using: String.Encoding.ascii)
qrFilter.setValue(qrData, forKey: "inputMessage")
let qrTransform = CGAffineTransform(scaleX: 12, y: 12)
return qrFilter.outputImage?.transformed(by: qrTransform)
}
}
然后像这样使用:
let data = "1234567890".dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter!.setValue(data, forKey: "inputMessage")
filter!.setValue("Q", forKey: "inputCorrectionLevel")
qrcodeImage = filter!.outputImage
let transformedImage = qrcodeImage.imageByApplyingTransform(CGAffineTransformMakeScale(150, 150))
QRCodeImage.image = UIImage(CIImage: transformedImage)
QRCodeImage.backgroundColor = UIColor.clearColor()
QRCodeImage.backgroundcolor = UIColor(white: 1, alpha: 0.5)
let myChosenColor = UIColor(red:0.93, green:0.31, blue:0.23, alpha:1.00)
let qrURLImage = URL(string: "https://stackoverflow.com")?.qrImage(using: myChosenColor)
myQrImageView.image = qrURLImage
在myQrImageView.image中,您将看到一个透明背景的qr图像:除了@jtbandes的答案之外,我还编写了一些代码,这样也可以帮助其他人
extension UIImage {
func transparentBackground() -> UIImage? {
let context = CIContext(options: nil)
let filter = CIFilter(name: "CIMaskToAlpha")
filter?.setDefaults()
filter?.setValue(self.ciImage, forKey: kCIInputImageKey)
if let output = filter?.outputImage,
let imageRef = context.createCGImage(output, from: output.extent) {
return UIImage(cgImage: imageRef)
}
return nil
}
func invertColor() -> UIImage? {
let filter = CIFilter(name: "CIColorInvert")
filter?.setDefaults()
filter?.setValue(self.ciImage, forKey: kCIInputImageKey)
if let output = filter?.outputImage {
return UIImage(ciImage: output)
}
return nil
}
}
像这样使用它
yourUIImage.invertColor()?.transparentBackground()
transparentBackground()
函数将删除黑色并保留白色,因为invertColor()
将用白色替换黑色您可能必须在Library中更改此项,我如何才能做到这一点?哦,对不起@jtbandes的一个答案很好;与此相关的是,你有一个代码,在Arun Amayana提出的答案上可能对你有用:问题是,这个解决方案不是一个快速的解决方案:(这个呢?QRCodeImage.backgroundColor=UIColor.clearColor())哦,再次抱歉。也许这里你有一些不同的东西:很好的挖掘:)(拇指支撑)很棒的家伙,但你知道,一个小小的代码示例不会有什么坏处!
extension UIImage {
func alpha(_ value: CGFloat) -> UIImage {
UIGraphicsBeginImageContextWithOptions(size, false, scale)
draw(at: CGPoint.zero, blendMode: .normal, alpha: value)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
}