Objective-Cで UIImageにブレンドモードを指定し表示するサンプルを以下に作成しました。
カメラアプリの実験用に Photoshopのように画像を重ねてブレンド表示する方法を色々試しましたので、以下に詳細を記載します。
サンプルダウンロード
使用する画像



ブレンドモードの種類
CGBlendMode |
説明 |
kCGBlendModeMultiply |
乗算 |
kCGBlendModeScreen |
スクリーン |
kCGBlendModeOverlay |
オーバーレイ |
kCGBlendModeDarken |
比較(暗) |
kCGBlendModeLighten |
比較(明) |
kCGBlendModeColorDodge |
覆い焼きカラー |
kCGBlendModeColorBurn |
焼きこみカラー |
kCGBlendModeSoftLight |
ソフトライト |
kCGBlendModeHardLight |
ハードライト |
kCGBlendModeDifference |
差の絶対値 |
kCGBlendModeExclusion |
除外 |
kCGBlendModeHue |
色相 |
kCGBlendModeSaturation |
彩度 |
kCGBlendModeColor |
カラー |
kCGBlendModeLuminosity |
輝度 |
kCGBlendModeClear |
透明色で描画 |
ソースコード
ViewController.h
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
33
| #import <UIKit/UIKit.h>
#define BACK_IMAGE @"blend_image.png"
#define BACK_IMAGE_WIDTH 640
#define BACK_IMAGE_HEIGHT 1136
#define FRONT_IMAGE @"Asymmetry_640_1136.jpg"
#define FRONT_IMAGE_WIDTH 640
#define FRONT_IMAGE_HEIGHT 1136
#define FRONT_IMAGE_ALPHA 1.0f
#define PREVIEW_IMAGE_WIDTH 80
#define PREVIEW_IMAGE_HEIGHT 142
#define BLEND_MODE_LABEL_HEIGHT 20
@interface BlendMode : UIView {
@private
UIImage *frontImage_;
UIImage *backImage_;
CGBlendMode blendMode_;
}
@property (nonatomic, assign) CGBlendMode blendMode;
- (void)changeMode;
@end
@interface ViewController : UIViewController {
@private
BlendMode *blendMode_;
UILabel *blendModeLabel_;
}
@end
|
ViewController.m
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
| #import "ViewController.h"
@implementation BlendMode
@synthesize blendMode = blendMode_;
- (id)init
{
if (self = [super init]) {
backImage_ = [UIImage imageNamed:BACK_IMAGE];
frontImage_ = [UIImage imageNamed:FRONT_IMAGE];
CGRect newFrame = self.frame;
newFrame.size = frontImage_.size;
self.frame = newFrame;
}
return self;
}
- (void)drawRect:(CGRect)rect
{
[backImage_ drawInRect:rect];
[frontImage_ drawInRect:rect blendMode:blendMode_ alpha:FRONT_IMAGE_ALPHA];
}
- (void)changeMode
{
if (kCGBlendModeLuminosity < ++blendMode_) {
blendMode_ = kCGBlendModeNormal;
}
}
@end
#pragma mark private methods definition
@interface ViewController ()
- (void)changeLabel;
@end
#pragma mark start implementation for methods
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//初期化
blendMode_ = [[BlendMode alloc] init];
blendMode_.center = self.view.center;
blendMode_.autoresizingMask =
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleBottomMargin;
[self.view addSubview:blendMode_];
//重ねて表示するイメージ表示
UIImage *imageBack = [UIImage imageNamed:BACK_IMAGE];
UIImageView *imageViewBack = [[UIImageView alloc] initWithImage:imageBack];
imageViewBack.frame = CGRectMake(0, 0, BACK_IMAGE_WIDTH, BACK_IMAGE_HEIGHT);
imageViewBack.autoresizingMask =
UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleBottomMargin;
[self.view addSubview:imageViewBack];
//プレビューイメージ表示
UIImage *imageFront = [UIImage imageNamed:FRONT_IMAGE];
UIImageView *imageViewFront = [[UIImageView alloc] initWithImage:imageFront];
imageViewFront.frame = CGRectMake(320 - PREVIEW_IMAGE_WIDTH,
0,
PREVIEW_IMAGE_WIDTH,
PREVIEW_IMAGE_HEIGHT);
imageViewFront.autoresizingMask = imageViewFront.autoresizingMask;
[self.view addSubview:imageViewFront];
//ブレンドモードを変更するラベル表示
blendModeLabel_ = [[UILabel alloc] init];
blendModeLabel_.frame = CGRectMake(0,
self.view.bounds.size.height - BLEND_MODE_LABEL_HEIGHT,
self.view.bounds.size.width,
BLEND_MODE_LABEL_HEIGHT);
blendModeLabel_.autoresizingMask =
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleBottomMargin;
blendModeLabel_.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:blendModeLabel_];
//ラベル変更
[self changeLabel];
}
#pragma mark private methods
- (void)changeLabel {
switch (blendMode_.blendMode) {
case kCGBlendModeMultiply: blendModeLabel_.text = @"kCGBlendModeMultiply"; break; /* 乗算 */
case kCGBlendModeScreen: blendModeLabel_.text = @"kCGBlendModeScreen"; break; /* スクリーン */
case kCGBlendModeOverlay: blendModeLabel_.text = @"kCGBlendModeOverlay"; break; /* オーバーレイ */
case kCGBlendModeDarken: blendModeLabel_.text = @"kCGBlendModeDarken"; break; /* 比較(暗) */
case kCGBlendModeLighten: blendModeLabel_.text = @"kCGBlendModeLighten"; break; /* 比較(明) */
case kCGBlendModeColorDodge: blendModeLabel_.text = @"kCGBlendModeColorDodge"; break; /* 覆い焼きカラー */
case kCGBlendModeColorBurn: blendModeLabel_.text = @"kCGBlendModeColorBurn"; break; /* 焼きこみカラー */
case kCGBlendModeSoftLight: blendModeLabel_.text = @"kCGBlendModeSoftLight"; break; /* ソフトライト */
case kCGBlendModeHardLight: blendModeLabel_.text = @"kCGBlendModeHardLight"; break; /* ハードライト */
case kCGBlendModeDifference: blendModeLabel_.text = @"kCGBlendModeDifference"; break; /* 差の絶対値 */
case kCGBlendModeExclusion: blendModeLabel_.text = @"kCGBlendModeExclusion"; break; /* 除外 */
case kCGBlendModeHue: blendModeLabel_.text = @"kCGBlendModeHue"; break; /* 色相 */
case kCGBlendModeSaturation: blendModeLabel_.text = @"kCGBlendModeSaturation"; break; /* 彩度 */
case kCGBlendModeColor: blendModeLabel_.text = @"kCGBlendModeColor"; break; /* カラー */
case kCGBlendModeLuminosity: blendModeLabel_.text = @"kCGBlendModeLuminosity"; break; /* 輝度 */
case kCGBlendModeClear: blendModeLabel_.text = @"kCGBlendModeClear"; break; /* 透明色で描画 */
case kCGBlendModeCopy: blendModeLabel_.text = @"kCGBlendModeCopy"; break; /* コピー */
case kCGBlendModeSourceIn: blendModeLabel_.text = @"kCGBlendModeSourceIn"; break;
case kCGBlendModeSourceOut: blendModeLabel_.text = @"kCGBlendModeSourceOut"; break;
case kCGBlendModeSourceAtop: blendModeLabel_.text = @"kCGBlendModeSourceAtop"; break;
case kCGBlendModeDestinationOver: blendModeLabel_.text = @"kCGBlendModeDestinationOver"; break;
case kCGBlendModeDestinationIn: blendModeLabel_.text = @"kCGBlendModeDestinationIn"; break;
case kCGBlendModeDestinationOut: blendModeLabel_.text = @"kCGBlendModeDestinationOut"; break;
case kCGBlendModeDestinationAtop: blendModeLabel_.text = @"kCGBlendModeDestinationAtop"; break;
case kCGBlendModeXOR: blendModeLabel_.text = @"kCGBlendModeXOR"; break;
case kCGBlendModePlusDarker: blendModeLabel_.text = @"kCGBlendModePlusDarker"; break;
case kCGBlendModePlusLighter: blendModeLabel_.text = @"kCGBlendModePlusLighter"; break;
default: blendModeLabel_.text = @"kCGBlendModeNormal"; break;
}
}
#pragma mark responder
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
//ブレンドモード変更
[blendMode_ changeMode];
//ラベルの変更
[self changeLabel];
//ブレンド実行
[blendMode_ setNeedsDisplay];
}
@end
|
お薦めの参考書
Swiftポケットリファレンス
Swiftの基本的な使い方から、データ処理やネットワーク処理の応用まで、逆引き形式で調べられる良書です。サンプルコードも Webからダウンロード出来、とても便利です。内容としては中級者向けですが、手元にあれば安心の一冊です。