画像の黒い部分を透明にするスイッチを付けたiPhoneアプリのサンプルコードを描いてみます。
#import “ViewController.h”
@interface ViewController ()
@property (nonatomic, weak) UIImageView *blackImageView;
@end
@implementation ViewController
– (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.4];
[self createBackgroundBrownImageView];
[self createMainBlackToClearView];
[self createSwitch];
}
– (void)createMainBlackToClearView
{
UIImage *blackImg = [UIImage imageNamed:@”black”];
UIImageView *mainView = [[UIImageView alloc] initWithImage:blackImg];
mainView.center = CGPointMake(160, 250);
[self.view addSubview:mainView];
self.blackImageView = mainView;
}
– (void)createBackgroundBrownImageView
{
UIImage *background = [UIImage imageNamed:@”back”];
UIImageView *backgroundView = [[UIImageView alloc] initWithImage:background];
backgroundView.center = CGPointMake(160, 250);
backgroundView.transform = CGAffineTransformMakeScale(1.1, 1.1);
[self.view addSubview:backgroundView];
}
– (void)createSwitch
{
UISwitch *sw = [[UISwitch alloc] init];
[sw sizeToFit];
sw.center = CGPointMake(160, CGRectGetMaxY(self.view.frame) – 40);
sw.onTintColor = [UIColor whiteColor];
[self.view addSubview:sw];
[sw addTarget:self action:@selector(change:) forControlEvents:UIControlEventValueChanged];
}
– (void)change:(UISwitch *)sender
{
UIImage *original = [UIImage imageNamed:@”black”];
if (sender.isOn) {
CIImage *image = [CIImage imageWithCGImage:original.CGImage];
CIImage *result = [self outputImage:image];
self.blackImageView.image = [UIImage imageWithCIImage:result];
} else {
self.blackImageView.image = original;
}
}
#pragma mark – color cube
// @see “Core Image Programming Guide”
typedef struct {
double r; // percent
double g; // percent
double b; // percent
} rgb;
– (CIImage *) outputImage:(CIImage *)input
{
const unsigned int size = 64;
float *cubeData = (float *)malloc (size * size * size * sizeof (float) * 4);
float *c = cubeData;
rgb rgbInput;
// Populate cube data
for (int z = 0; z < size; z++){
rgbInput.b = ((double)z)/(size-1); // Blue value
for (int y = 0; y < size; y++){
rgbInput.g = ((double)y)/(size-1); // Green value
for (int x = 0; x < size; x ++){
rgbInput.r = ((double)x)/(size-1); // Red value
// ——————————
// black to clear (alpha -> 0)
// ——————————
float alpha = (rgbInput.r == 0 && rgbInput.g == 0 && rgbInput.b == 0) ? 0.0f: 1.0f;
c[0] = rgbInput.b * alpha;
c[1] = rgbInput.g * alpha;
c[2] = rgbInput.r * alpha;
c[3] = alpha;
c += 4; // advance our pointer into memory for the next color value
}
}
}
// Create memory with the cube data
NSData *data = [NSData dataWithBytesNoCopy:cubeData length:size * size * size * sizeof (float) * 4 freeWhenDone:YES];
CIFilter *colorCube = [CIFilter filterWithName:@”CIColorCube”];
[colorCube setValue:@(size) forKey:@”inputCubeDimension”];
[colorCube setValue:data forKey:@”inputCubeData”];
[colorCube setValue:input forKey:kCIInputImageKey];
CIImage *result = [colorCube valueForKey:kCIOutputImageKey];
return result;
}
@end