iPhone黒バックを透明に

画像の黒い部分を透明にするスイッチを付けた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