您的位置:首页 > 其它

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

2015-06-16 18:23 567 查看
一张图片,通过混合模式绘制后,能得到不同效果的图片。

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

效果如下:





[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: