将图像转换为灰度会弄乱 alpha
Converting image to grayscale messes up alpha
这是我用来将图像转换为灰度的代码。
func convertToGrayScale(image: UIImage) -> UIImage
{
let imageRect:CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
let colorSpace = CGColorSpaceCreateDeviceGray()
let width = image.size.width
let height = image.size.height
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.None.rawValue)
let context = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo.rawValue)
CGContextDrawImage(context, imageRect, image.CGImage)
let imageRef = CGBitmapContextCreateImage(context)
let newImage = UIImage(CGImage: imageRef!)
return newImage
}
这是结果:
我不想看到黑色背景。我该如何解决?
编辑:我试过用这段代码来做,它有效,但现在加载图像需要 3 秒。
func convertToGrayScale(image: UIImage) -> UIImage {
let cgImage = image.CGImage!
let beginImage = CIImage(CGImage: cgImage)
let filter = CIFilter(name: "CIColorControls")!
filter.setValue(beginImage, forKey: kCIInputImageKey)
filter.setValue(0, forKey: kCIInputSaturationKey)
return UIImage(CIImage: filter.outputImage!)
}
这个功能解决了我的问题。它不一定将图像变成灰度,但我能够将未知食谱设为黑色,半已知为深灰色,已知为彩色。
func createTintedImageFromImage(originalImage: UIImage, desiredColor: UIColor) -> UIImage {
let imageSize: CGSize = originalImage.size
let imageScale: CGFloat = originalImage.scale
let contextBounds: CGRect = CGRectMake(0, 0, imageSize.width, imageSize.height)
UIGraphicsBeginImageContextWithOptions(imageSize, false, imageScale)
UIColor.blackColor().setFill()
UIRectFill(contextBounds)
originalImage.drawAtPoint(CGPointZero)
let imageOverBlack: UIImage = UIGraphicsGetImageFromCurrentImageContext()
desiredColor.setFill()
UIRectFill(contextBounds)
imageOverBlack.drawAtPoint(CGPointZero, blendMode: .Multiply, alpha: 1)
originalImage.drawAtPoint(CGPointZero, blendMode: .DestinationIn, alpha: 1)
let finalImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return finalImage
}
这是我用来将图像转换为灰度的代码。
func convertToGrayScale(image: UIImage) -> UIImage
{
let imageRect:CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
let colorSpace = CGColorSpaceCreateDeviceGray()
let width = image.size.width
let height = image.size.height
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.None.rawValue)
let context = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo.rawValue)
CGContextDrawImage(context, imageRect, image.CGImage)
let imageRef = CGBitmapContextCreateImage(context)
let newImage = UIImage(CGImage: imageRef!)
return newImage
}
这是结果:
我不想看到黑色背景。我该如何解决?
编辑:我试过用这段代码来做,它有效,但现在加载图像需要 3 秒。
func convertToGrayScale(image: UIImage) -> UIImage {
let cgImage = image.CGImage!
let beginImage = CIImage(CGImage: cgImage)
let filter = CIFilter(name: "CIColorControls")!
filter.setValue(beginImage, forKey: kCIInputImageKey)
filter.setValue(0, forKey: kCIInputSaturationKey)
return UIImage(CIImage: filter.outputImage!)
}
这个功能解决了我的问题。它不一定将图像变成灰度,但我能够将未知食谱设为黑色,半已知为深灰色,已知为彩色。
func createTintedImageFromImage(originalImage: UIImage, desiredColor: UIColor) -> UIImage {
let imageSize: CGSize = originalImage.size
let imageScale: CGFloat = originalImage.scale
let contextBounds: CGRect = CGRectMake(0, 0, imageSize.width, imageSize.height)
UIGraphicsBeginImageContextWithOptions(imageSize, false, imageScale)
UIColor.blackColor().setFill()
UIRectFill(contextBounds)
originalImage.drawAtPoint(CGPointZero)
let imageOverBlack: UIImage = UIGraphicsGetImageFromCurrentImageContext()
desiredColor.setFill()
UIRectFill(contextBounds)
imageOverBlack.drawAtPoint(CGPointZero, blendMode: .Multiply, alpha: 1)
originalImage.drawAtPoint(CGPointZero, blendMode: .DestinationIn, alpha: 1)
let finalImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return finalImage
}