• 154在屏幕中绘图时设置透明度(扩展知识:为图片视图添加点击手势识别器,来实现点击事件操作)


    一张图片,通过混合模式绘制后,能得到不同效果的图片。

    这里的示例仅是测试效果;实际上可以通过不同程度的混合模式绘制,来得到符合需求的效果。

    效果如下:

    ViewController.h

    1 #import <UIKit/UIKit.h>
    2 
    3 @interface ViewController : UIViewController
    4 @property (strong, nonatomic) UIImageView *imgVBlend;
    5 @property (strong, nonatomic) UILabel *lblMsg;
    6 
    7 @end

    ViewController.m

      1 #import "ViewController.h"
      2 #import "UIImage+BlendMode.h"
      3 
      4 @interface ViewController ()
      5 - (void)layoutUI;
      6 - (void)changeBlendMode;
      7 @end
      8 
      9 @implementation ViewController
     10 #define kImgBlend [UIImage imageNamed:@"ImageForBlend"]
     11 
     12 - (void)viewDidLoad {
     13     [super viewDidLoad];
     14     
     15     [self layoutUI];
     16 }
     17 
     18 - (void)didReceiveMemoryWarning {
     19     [super didReceiveMemoryWarning];
     20     // Dispose of any resources that can be recreated.
     21 }
     22 
     23 - (void)layoutUI {
     24     //添加图片视图_imgVBlend
     25     CGPoint newPoint = self.view.center;
     26     _imgVBlend = [[UIImageView alloc] initWithImage:kImgBlend];
     27     _imgVBlend.center = newPoint;
     28     //在允许进行用户交互操作前提下,通过为图片视图_imgVBlend添加点击手势识别器,来实现点击事件操作
     29     _imgVBlend.userInteractionEnabled = YES; //设置是否允许进行用户交互操作;默认值为NO
     30     UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self
     31                                                                               action:@selector(changeBlendMode)];
     32     gesture.numberOfTouchesRequired = 1; //设置触摸手指数;默认值为1
     33     gesture.numberOfTapsRequired = 1; //设置点击数;默认值为1,表示单击
     34     [_imgVBlend addGestureRecognizer:gesture];
     35     [self.view addSubview:_imgVBlend];
     36     
     37     //添加标签_lblMsg
     38     _lblMsg = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width - 40, 120)];
     39     newPoint.y += 144;
     40     _lblMsg.center = newPoint;
     41     _lblMsg.numberOfLines = 0;
     42     _lblMsg.text = @"在屏幕中绘图时设置透明度;点击图片切换为混合模式绘制的图片";
     43     _lblMsg.textAlignment = NSTextAlignmentLeft;
     44     _lblMsg.textColor = [UIColor blackColor];
     45     _lblMsg.layer.borderColor = [UIColor grayColor].CGColor;
     46     _lblMsg.layer.borderWidth = 1.0;
     47     [self.view addSubview:_lblMsg];
     48     
     49     
     50 //    enum CGBlendMode {
     51 //        /* Available in Mac OS X 10.4 & later. */
     52 //        kCGBlendModeNormal,
     53 //        kCGBlendModeMultiply,
     54 //        kCGBlendModeScreen,
     55 //        kCGBlendModeOverlay,
     56 //        kCGBlendModeDarken,
     57 //        kCGBlendModeLighten,
     58 //        kCGBlendModeColorDodge,
     59 //        kCGBlendModeColorBurn,
     60 //        kCGBlendModeSoftLight,
     61 //        kCGBlendModeHardLight,
     62 //        kCGBlendModeDifference,
     63 //        kCGBlendModeExclusion,
     64 //        kCGBlendModeHue,
     65 //        kCGBlendModeSaturation,
     66 //        kCGBlendModeColor,
     67 //        kCGBlendModeLuminosity,
     68 //        
     69 //        /* Available in Mac OS X 10.5 & later. R, S, and D are, respectively,
     70 //         premultiplied result, source, and destination colors with alpha; Ra,
     71 //         Sa, and Da are the alpha components of these colors.
     72 //         
     73 //         The Porter-Duff "source over" mode is called `kCGBlendModeNormal':
     74 //         R = S + D*(1 - Sa)
     75 //         
     76 //         Note that the Porter-Duff "XOR" mode is only titularly related to the
     77 //         classical bitmap XOR operation (which is unsupported by
     78 //         CoreGraphics). */
     79 //        
     80 //        kCGBlendModeClear,            /* R = 0 */
     81 //        kCGBlendModeCopy,            /* R = S */
     82 //        kCGBlendModeSourceIn,        /* R = S*Da */
     83 //        kCGBlendModeSourceOut,        /* R = S*(1 - Da) */
     84 //        kCGBlendModeSourceAtop,        /* R = S*Da + D*(1 - Sa) */
     85 //        kCGBlendModeDestinationOver,    /* R = S*(1 - Da) + D */
     86 //        kCGBlendModeDestinationIn,        /* R = D*Sa */
     87 //        kCGBlendModeDestinationOut,        /* R = D*(1 - Sa) */
     88 //        kCGBlendModeDestinationAtop,    /* R = S*(1 - Da) + D*Sa */
     89 //        kCGBlendModeXOR,            /* R = S*(1 - Da) + D*(1 - Sa) */
     90 //        kCGBlendModePlusDarker,        /* R = MAX(0, (1 - D) + (1 - S)) */
     91 //        kCGBlendModePlusLighter        /* R = MIN(1, S + D) */
     92 //    };
     93 //    typedef enum CGBlendMode CGBlendMode; /* Available in Mac OS X 10.4 & later. */
     94 }
     95 
     96 - (void)changeBlendMode {
     97     static CGBlendMode blendMode = kCGBlendModeNormal;
     98     NSString *strMsg;
     99     switch (blendMode) {
    100         case kCGBlendModeNormal: {
    101             strMsg = @"kCGBlendModeNormal: 正常;也是默认的模式。前景图会覆盖背景图";
    102             break;
    103         }
    104         case kCGBlendModeMultiply: {
    105             strMsg = @"kCGBlendModeMultiply: 正片叠底;混合了前景和背景的颜色,最终颜色比原先的都暗";
    106             break;
    107         }
    108         case kCGBlendModeScreen: {
    109             strMsg = @"kCGBlendModeScreen: 滤色;把前景和背景图的颜色先反过来,然后混合";
    110             break;
    111         }
    112         case kCGBlendModeOverlay: {
    113             strMsg = @"kCGBlendModeOverlay: 覆盖;能保留灰度信息,结合kCGBlendModeSaturation能保留透明度信息,在imageWithBlendMode方法中两次执行drawInRect方法实现我们基本需求";
    114             break;
    115         }
    116         case kCGBlendModeDarken: {
    117             strMsg = @"kCGBlendModeDarken: 变暗";
    118             break;
    119         }
    120         case kCGBlendModeLighten: {
    121             strMsg = @"kCGBlendModeLighten: 变亮";
    122             break;
    123         }
    124         case kCGBlendModeColorDodge: {
    125             strMsg = @"kCGBlendModeColorDodge: 颜色变淡";
    126             break;
    127         }
    128         case kCGBlendModeColorBurn: {
    129             strMsg = @"kCGBlendModeColorBurn: 颜色加深";
    130             break;
    131         }
    132         case kCGBlendModeSoftLight: {
    133             strMsg = @"kCGBlendModeSoftLight: 柔光";
    134             break;
    135         }
    136         case kCGBlendModeHardLight: {
    137             strMsg = @"kCGBlendModeHardLight: 强光";
    138             break;
    139         }
    140         case kCGBlendModeDifference: {
    141             strMsg = @"kCGBlendModeDifference: 插值";
    142             break;
    143         }
    144         case kCGBlendModeExclusion: {
    145             strMsg = @"kCGBlendModeExclusion: 排除";
    146             break;
    147         }
    148         case kCGBlendModeHue: {
    149             strMsg = @"kCGBlendModeHue: 色调";
    150             break;
    151         }
    152         case kCGBlendModeSaturation: {
    153             strMsg = @"kCGBlendModeSaturation: 饱和度";
    154             break;
    155         }
    156         case kCGBlendModeColor: {
    157             strMsg = @"kCGBlendModeColor: 颜色";
    158             break;
    159         }
    160         case kCGBlendModeLuminosity: {
    161             strMsg = @"kCGBlendModeLuminosity: 亮度";
    162             break;
    163         }
    164         //Apple额外定义的枚举
    165         //R: premultiplied result, 表示混合结果
    166         //S: Source, 表示源颜色(Sa对应透明度值: 0.0-1.0)
    167         //D: destination colors with alpha, 表示带透明度的目标颜色(Da对应透明度值: 0.0-1.0)
    168         case kCGBlendModeClear: {
    169             strMsg = @"kCGBlendModeClear: R = 0";
    170             break;
    171         }
    172         case kCGBlendModeCopy: {
    173             strMsg = @"kCGBlendModeCopy: R = S";
    174             break;
    175         }
    176         case kCGBlendModeSourceIn: {
    177             strMsg = @"kCGBlendModeSourceIn: R = S*Da";
    178             break;
    179         }
    180         case kCGBlendModeSourceOut: {
    181             strMsg = @"kCGBlendModeSourceOut: R = S*(1 - Da)";
    182             break;
    183         }
    184         case kCGBlendModeSourceAtop: {
    185             strMsg = @"kCGBlendModeSourceAtop: R = S*Da + D*(1 - Sa)";
    186             break;
    187         }
    188         case kCGBlendModeDestinationOver: {
    189             strMsg = @"kCGBlendModeDestinationOver: R = S*(1 - Da) + D";
    190             break;
    191         }
    192         case kCGBlendModeDestinationIn: {
    193             strMsg = @"kCGBlendModeDestinationIn: R = D*Sa;能保留透明度信息";
    194             break;
    195         }
    196         case kCGBlendModeDestinationOut: {
    197             strMsg = @"kCGBlendModeDestinationOut: R = D*(1 - Sa)";
    198             break;
    199         }
    200         case kCGBlendModeDestinationAtop: {
    201             strMsg = @"kCGBlendModeDestinationAtop: R = S*(1 - Da) + D*Sa";
    202             break;
    203         }
    204         case kCGBlendModeXOR: {
    205             strMsg = @"kCGBlendModeXOR: R = S*(1 - Da) + D*(1 - Sa)";
    206             break;
    207         }
    208         case kCGBlendModePlusDarker: {
    209             strMsg = @"kCGBlendModePlusDarker: R = MAX(0, (1 - D) + (1 - S))";
    210             break;
    211         }
    212         case kCGBlendModePlusLighter: {
    213             strMsg = @"kCGBlendModePlusLighter: R = MIN(1, S + D)(最后一种混合模式)";
    214             break;
    215         }
    216         default: {
    217             break;
    218         }
    219     }
    220     _imgVBlend.image = [kImgBlend imageWithBlendMode:blendMode tintColor:[UIColor orangeColor]]; //使用分类Category来扩展UIImage,添加自定义实例方法imageWithBlendMode
    221     _lblMsg.text = strMsg;
    222     
    223     blendMode++;
    224     if (blendMode > kCGBlendModePlusLighter) {
    225         blendMode = kCGBlendModeNormal;
    226     }
    227 }
    228 
    229 @end

    UIImage+BlendMode.h

    1 #import <UIKit/UIKit.h>
    2 
    3 @interface UIImage (BlendMode)
    4 - (UIImage *)imageWithBlendMode:(CGBlendMode)blendMode tintColor:(UIColor *)tintColor;
    5 
    6 @end

    UIImage+BlendMode.m

     1 #import "UIImage+BlendMode.h"
     2 
     3 @implementation UIImage (BlendMode)
     4 
     5 - (UIImage *)imageWithBlendMode:(CGBlendMode)blendMode tintColor:(UIColor *)tintColor {
     6     UIImage *img;
     7     UIGraphicsBeginImageContextWithOptions(self.size, NO, 0); //开始图片上下文绘制
     8     
     9     [tintColor setFill]; //填充颜色
    10     CGRect newRect = CGRectMake(0, 0, self.size.width, self.size.height);
    11     UIRectFill(newRect);
    12     [self drawInRect:newRect blendMode:blendMode alpha:1.0]; //设置绘画透明混合模式和透明度
    13     if (blendMode == kCGBlendModeOverlay) {
    14         [self drawInRect:newRect blendMode:kCGBlendModeDestinationIn alpha:1.0]; //能保留透明度信息
    15     }
    16     
    17     img = UIGraphicsGetImageFromCurrentImageContext();
    18     
    19     UIGraphicsEndImageContext(); //结束图片上下文绘制
    20     return img;
    21 }
    22 
    23 @end
  • 相关阅读:
    log4j使用方法(一)——先跑起来再说
    umasuo—ubuntu G++的安装
    Linux使用SVN server的简单介绍
    BeanUtils中copyProperties方法的使用
    标准化安装_RHEL5.5(X64)_Oracle10gR2
    Learn How To Use Oracle Flashback
    Learn How To Use Oracle Audit
    idea导入本地的eclipse项目
    Docker 资源汇总
    Docker Dockerfile
  • 原文地址:https://www.cnblogs.com/huangjianwu/p/4581509.html
Copyright © 2020-2023  润新知