灰度缩放整个视图

时间:2016-03-31 07:14:16

标签: ios swift

我正在开发一个基于swift的应用程序,它显示了一些事件。每个事件都有时间限制,事件到期后。

我希望在事件到期后使事件屏幕变为灰度,我尝试过这样的事情:

  1. 蒙版视图

            if let maskImage = UIImage(named: "MaskImage"){
            myView.maskView = UIImageView(image: maskImage)
        }
    
  2.   

    上面的解决方案不起作用,因为我的事件屏幕也包含彩色图像

    1. 以递归方式提取所有subviews并尝试设置backgroundColor但未使用

    2. 更改显示褪色白色的所有alpha的{​​{1}}值

    3. 查询:我的活动屏幕上有许多彩色图片和一些彩色标签,如何以灰度制作所有这些?

      任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

经过一些研究后,我在整个视图中实现了灰度缩放效果:

/**
     To convert an image to grayscale

     - parameter image: The UIImage to be converted

     - returns: The UIImage after conversion
     */
    static func convertToGrayScale(_ image: UIImage?) -> UIImage? {
        if image == nil {
            return nil
        }
        let imageRect:CGRect = CGRect(x: 0, y: 0, width: image!.size.width, height: 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 = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)

        context?.draw(image!.cgImage!, in: imageRect)
        let imageRef = context?.makeImage()
        let newImage = UIImage(cgImage: imageRef!)

        return newImage
    }

上述方法适用于所呈现视图中的所有彩色图像,同样可用于myView.maskView = UIImageView(image: maskImage)

这将灰度显示整个视图,而灰度缩放时只使用我使用的标签和文本:

// Convert to grayscale
    func convertToGrayScaleColor() -> UIColor? {
        if self == UIColor.clear {
            return UIColor.clear
        }
        var fRed : CGFloat = 0
        var fGreen : CGFloat = 0
        var fBlue : CGFloat = 0
        var fAlpha: CGFloat = 0
        if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) {
            if fRed == 0 && fGreen == 0 && fBlue == 0{
                return  UIColor.gray
            }else{
                let grayScaleColor = (fRed + fGreen + fBlue)/3
                return UIColor(red: grayScaleColor, green: grayScaleColor, blue: grayScaleColor, alpha: fAlpha)
            }
        } else {
            print("Could not extract RGBA components, so rolling back to default UIColor.grayColor()")
            return UIColor.gray
        }
    }

上述方法是extension UIColor部分。上面的代码是使用xcode 8.1

在Swift 3.0中编写的
  

如果对答案中的任何事情感到担忧或混淆,请随时发表评论。