154在屏幕中绘图时设置透明度(扩展知识:为图片视图添加点击手势识别器,来实现点击事件操作)
2015-06-16 18:23
567 查看
一张图片,通过混合模式绘制后,能得到不同效果的图片。
这里的示例仅是测试效果;实际上可以通过不同程度的混合模式绘制,来得到符合需求的效果。
效果如下:
[b]ViewController.h[/b]
ViewController.m
UIImage+BlendMode.h
UIImage+BlendMode.m
这里的示例仅是测试效果;实际上可以通过不同程度的混合模式绘制,来得到符合需求的效果。
效果如下:
[b]ViewController.h[/b]
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (strong, nonatomic) UIImageView *imgVBlend; @property (strong, nonatomic) UILabel *lblMsg; @end
ViewController.m
#import "ViewController.h" #import "UIImage+BlendMode.h" @interface ViewController () - (void)layoutUI; - (void)changeBlendMode; @end @implementation ViewController #define kImgBlend [UIImage imageNamed:@"ImageForBlend"] - (void)viewDidLoad { [super viewDidLoad]; [self layoutUI]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)layoutUI { //添加图片视图_imgVBlend CGPoint newPoint = self.view.center; _imgVBlend = [[UIImageView alloc] initWithImage:kImgBlend]; _imgVBlend.center = newPoint; //在允许进行用户交互操作前提下,通过为图片视图_imgVBlend添加点击手势识别器,来实现点击事件操作 _imgVBlend.userInteractionEnabled = YES; //设置是否允许进行用户交互操作;默认值为NO UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeBlendMode)]; gesture.numberOfTouchesRequired = 1; //设置触摸手指数;默认值为1 gesture.numberOfTapsRequired = 1; //设置点击数;默认值为1,表示单击 [_imgVBlend addGestureRecognizer:gesture]; [self.view addSubview:_imgVBlend]; //添加标签_lblMsg _lblMsg = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width - 40, 120)]; newPoint.y += 144; _lblMsg.center = newPoint; _lblMsg.numberOfLines = 0; _lblMsg.text = @"在屏幕中绘图时设置透明度;点击图片切换为混合模式绘制的图片"; _lblMsg.textAlignment = NSTextAlignmentLeft; _lblMsg.textColor = [UIColor blackColor]; _lblMsg.layer.borderColor = [UIColor grayColor].CGColor; _lblMsg.layer.borderWidth = 1.0; [self.view addSubview:_lblMsg]; // enum CGBlendMode { // /* Available in Mac OS X 10.4 & later. */ // kCGBlendModeNormal, // kCGBlendModeMultiply, // kCGBlendModeScreen, // kCGBlendModeOverlay, // kCGBlendModeDarken, // kCGBlendModeLighten, // kCGBlendModeColorDodge, // kCGBlendModeColorBurn, // kCGBlendModeSoftLight, // kCGBlendModeHardLight, // kCGBlendModeDifference, // kCGBlendModeExclusion, // kCGBlendModeHue, // kCGBlendModeSaturation, // kCGBlendModeColor, // kCGBlendModeLuminosity, // // /* Available in Mac OS X 10.5 & later. R, S, and D are, respectively, // premultiplied result, source, and destination colors with alpha; Ra, // Sa, and Da are the alpha components of these colors. // // The Porter-Duff "source over" mode is called `kCGBlendModeNormal': // R = S + D*(1 - Sa) // // Note that the Porter-Duff "XOR" mode is only titularly related to the // classical bitmap XOR operation (which is unsupported by // CoreGraphics). */ // // kCGBlendModeClear, /* R = 0 */ // kCGBlendModeCopy, /* R = S */ // kCGBlendModeSourceIn, /* R = S*Da */ // kCGBlendModeSourceOut, /* R = S*(1 - Da) */ // kCGBlendModeSourceAtop, /* R = S*Da + D*(1 - Sa) */ // kCGBlendModeDestinationOver, /* R = S*(1 - Da) + D */ // kCGBlendModeDestinationIn, /* R = D*Sa */ // kCGBlendModeDestinationOut, /* R = D*(1 - Sa) */ // kCGBlendModeDestinationAtop, /* R = S*(1 - Da) + D*Sa */ // kCGBlendModeXOR, /* R = S*(1 - Da) + D*(1 - Sa) */ // kCGBlendModePlusDarker, /* R = MAX(0, (1 - D) + (1 - S)) */ // kCGBlendModePlusLighter /* R = MIN(1, S + D) */ // }; // typedef enum CGBlendMode CGBlendMode; /* Available in Mac OS X 10.4 & later. */ } - (void)changeBlendMode { static CGBlendMode blendMode = kCGBlendModeNormal; NSString *strMsg; switch (blendMode) { case kCGBlendModeNormal: { strMsg = @"kCGBlendModeNormal: 正常;也是默认的模式。前景图会覆盖背景图"; break; } case kCGBlendModeMultiply: { strMsg = @"kCGBlendModeMultiply: 正片叠底;混合了前景和背景的颜色,最终颜色比原先的都暗"; break; } case kCGBlendModeScreen: { strMsg = @"kCGBlendModeScreen: 滤色;把前景和背景图的颜色先反过来,然后混合"; break; } case kCGBlendModeOverlay: { strMsg = @"kCGBlendModeOverlay: 覆盖;能保留灰度信息,结合kCGBlendModeSaturation能保留透明度信息,在imageWithBlendMode方法中两次执行drawInRect方法实现我们基本需求"; break; } case kCGBlendModeDarken: { strMsg = @"kCGBlendModeDarken: 变暗"; break; } case kCGBlendModeLighten: { strMsg = @"kCGBlendModeLighten: 变亮"; break; } case kCGBlendModeColorDodge: { strMsg = @"kCGBlendModeColorDodge: 颜色变淡"; break; } case kCGBlendModeColorBurn: { strMsg = @"kCGBlendModeColorBurn: 颜色加深"; break; } case kCGBlendModeSoftLight: { strMsg = @"kCGBlendModeSoftLight: 柔光"; break; } case kCGBlendModeHardLight: { strMsg = @"kCGBlendModeHardLight: 强光"; break; } case kCGBlendModeDifference: { strMsg = @"kCGBlendModeDifference: 插值"; break; } case kCGBlendModeExclusion: { strMsg = @"kCGBlendModeExclusion: 排除"; break; } case kCGBlendModeHue: { strMsg = @"kCGBlendModeHue: 色调"; break; } case kCGBlendModeSaturation: { strMsg = @"kCGBlendModeSaturation: 饱和度"; break; } case kCGBlendModeColor: { strMsg = @"kCGBlendModeColor: 颜色"; break; } case kCGBlendModeLuminosity: { strMsg = @"kCGBlendModeLuminosity: 亮度"; break; } //Apple额外定义的枚举 //R: premultiplied result, 表示混合结果 //S: Source, 表示源颜色(Sa对应透明度值: 0.0-1.0) //D: destination colors with alpha, 表示带透明度的目标颜色(Da对应透明度值: 0.0-1.0) case kCGBlendModeClear: { strMsg = @"kCGBlendModeClear: R = 0"; break; } case kCGBlendModeCopy: { strMsg = @"kCGBlendModeCopy: R = S"; break; } case kCGBlendModeSourceIn: { strMsg = @"kCGBlendModeSourceIn: R = S*Da"; break; } case kCGBlendModeSourceOut: { strMsg = @"kCGBlendModeSourceOut: R = S*(1 - Da)"; break; } case kCGBlendModeSourceAtop: { strMsg = @"kCGBlendModeSourceAtop: R = S*Da + D*(1 - Sa)"; break; } case kCGBlendModeDestinationOver: { strMsg = @"kCGBlendModeDestinationOver: R = S*(1 - Da) + D"; break; } case kCGBlendModeDestinationIn: { strMsg = @"kCGBlendModeDestinationIn: R = D*Sa;能保留透明度信息"; break; } case kCGBlendModeDestinationOut: { strMsg = @"kCGBlendModeDestinationOut: R = D*(1 - Sa)"; break; } case kCGBlendModeDestinationAtop: { strMsg = @"kCGBlendModeDestinationAtop: R = S*(1 - Da) + D*Sa"; break; } case kCGBlendModeXOR: { strMsg = @"kCGBlendModeXOR: R = S*(1 - Da) + D*(1 - Sa)"; break; } case kCGBlendModePlusDarker: { strMsg = @"kCGBlendModePlusDarker: R = MAX(0, (1 - D) + (1 - S))"; break; } case kCGBlendModePlusLighter: { strMsg = @"kCGBlendModePlusLighter: R = MIN(1, S + D)(最后一种混合模式)"; break; } default: { break; } } _imgVBlend.image = [kImgBlend imageWithBlendMode:blendMode tintColor:[UIColor orangeColor]]; //使用分类Category来扩展UIImage,添加自定义实例方法imageWithBlendMode _lblMsg.text = strMsg; blendMode++; if (blendMode > kCGBlendModePlusLighter) { blendMode = kCGBlendModeNormal; } } @end
UIImage+BlendMode.h
#import <UIKit/UIKit.h> @interface UIImage (BlendMode) - (UIImage *)imageWithBlendMode:(CGBlendMode)blendMode tintColor:(UIColor *)tintColor; @end
UIImage+BlendMode.m
#import "UIImage+BlendMode.h" @implementation UIImage (BlendMode) - (UIImage *)imageWithBlendMode:(CGBlendMode)blendMode tintColor:(UIColor *)tintColor { UIImage *img; UIGraphicsBeginImageContextWithOptions(self.size, NO, 0); //开始图片上下文绘制 [tintColor setFill]; //填充颜色 CGRect newRect = CGRectMake(0, 0, self.size.width, self.size.height); UIRectFill(newRect); [self drawInRect:newRect blendMode:blendMode alpha:1.0]; //设置绘画透明混合模式和透明度 if (blendMode == kCGBlendModeOverlay) { [self drawInRect:newRect blendMode:kCGBlendModeDestinationIn alpha:1.0]; //能保留透明度信息 } img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //结束图片上下文绘制 return img; } @end
相关文章推荐
- Ternary Search Tree Java实现
- SRS配置采集(ingest)
- OpenCms创建网站的过程示意图——专用OpenCms人们刚开始学习
- jsp防盗链代码
- Android Binder机制理解
- 有趣的笔试题(1)
- intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
- Tiny210编译和烧写u-boot步骤
- poj2583---Series Determination
- Kafka实战-实时日志统计流程
- response.getWriter().write()与out.print()的区别
- cocos2d-x3.3获取时间
- Ehcache 整合Spring 使用页面、对象缓存
- Solr与Mysql简单集成
- 解决php configure: error: Cannot find ldap libraries in /usr/lib.错误
- [LeetCode] Count Complete Tree Nodes
- WebGL自学教程——WebGL演示样本:开始
- FZU Problem 2171 防守阵地 II (线段树区间更新模板题)
- java.lang包的分类
- watch-3D.app开发经验(1)