• Swift


    类似于PS,Swift中也可对图片UIImage进行图层混合(blending),而且提供了相当丰富的混合模式(blendMode)。本文先介绍使用其中的kCGBlendModeDestinationIn实现图片颜色的修改。


    1,扩展UIImage,添加着色方法

    首先为便于blending,我们扩展系统UIImage类,给其增加tint方法,方法内部即为相关的图层混合操作。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import UIKit
     
    //--- UIImageTintExtension.swift ---
    extension UIImage
    {
        func tint(color: UIColor, blendMode: CGBlendMode) -> UIImage
        {
            let drawRect = CGRectMake(0.0, 0.0, size.width, size.height)
            UIGraphicsBeginImageContextWithOptions(size, false, scale)
            //let context = UIGraphicsGetCurrentContext()
            //CGContextClipToMask(context, drawRect, CGImage)
            color.setFill()
            UIRectFill(drawRect)
            drawInRect(drawRect, blendMode: blendMode, alpha: 1.0)
            let tintedImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return tintedImage
        }
    }

    2,改变图片的颜色
    有时我们的App需要能切换不同的主题和场景,希望图片能动态的改变颜色以配合对应场景的色调。虽然我们可以根据不同主题事先创建不同颜色的图片供调用,但既然用的图片素材都一样,还一个个转换显得太麻烦,而且不便于维护。使用blendMode变可以满足这个需求。

    (1)效果图如下
    可以看到最上面的一个是原图,下面三个是通过代码动态的改变颜色(透明度什么的都很好的保存了)


    (2)代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import UIKit
     
    class ViewController: UIViewController {
     
        //用于显示原图
        @IBOutlet weak var imageView0: UIImageView!
         
        //用于显示处理后的图片
        @IBOutlet weak var imageView1: UIImageView!
        @IBOutlet weak var imageView2: UIImageView!
        @IBOutlet weak var imageView3: UIImageView!
         
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
             
             //设置原图
             imageView0.image=UIImage(named:"logo6")
             
             //设置各种色调的图片
             imageView1.image = UIImage(named:"logo6")?.tint(UIColor.brownColor(),
                blendMode: .DestinationIn)
             imageView2.image = UIImage(named:"logo6")?.tint(UIColor.blueColor(),
                blendMode: .DestinationIn)
             imageView3.image = UIImage(named:"logo6")?.tint(UIColor.orangeColor(),
                blendMode: .DestinationIn)      
        }
         
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()      
        }
    }
  • 相关阅读:
    eclipse GWT开发环境的离线布置方法
    Eclipse(Myeclipse)安装GoogleGWT
    ASP.NET中的文件上传大小限制的问题
    ActivityCapture
    android camera 摄像头预览画面变形
    MUST_COMPLETE
    Stay true to yourself
    Android4.4 ContentResolver查询图片无效 及 图库删除 增加图片后,ContentResolver不更新的问题解决
    android 7.0以上共享文件(解决调用系统照相和图片剪切出现的FileUriExposedException崩溃问题)
    扫描指定目录下所有图片文件
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4843877.html
Copyright © 2020-2023  润新知