タッチしたところの色をピクセル毎に変更してみる

(XcodeのiOS6 iPhone Simulatorで動かしています。)

概要

タッチした場所から、20×20くらいの四角の範囲にあるpixelの色を、

赤、青、緑と変更させてみる。四角の選択によって、多様な模様

が作れるように、ピクセル単位で色の変更を行うようにする

ポイント

CGBitmapContextを使って、UIViewのpixel毎に色を操作していく。


サンプルコード

#import “ViewController.h”

#import <QuartzCore/QuartzCore.h>

@interface ColorPaper : UIView {

    CGContextRef bitmapContext;

    BOOL ready;

}

– (void)changeColors:(CGRect)rect;

@end

@implementation ColorPaper

– (void)drawRect:(CGRect)rect

{

    if (ready) {

        CGContextRef context = UIGraphicsGetCurrentContext();

        CGImageRef image = CGBitmapContextCreateImage(bitmapContext);

        CGContextDrawImage(context, self.bounds, image);

        CGImageRelease(image);

    }

    ready = YES;

}

– (void)changeColors:(CGRect)rect

{

    int width = self.bounds.size.width;

    int height = self.bounds.size.height;

    

    unsigned char *rawData = malloc(height * width * 4);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    bitmapContext = CGBitmapContextCreate(rawData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast);

    

    [self.layer renderInContext:bitmapContext];

    

    for (int i=0; i<height*width*4; i+=4) {

        

        int x = (i % (4 * width)) / 4;

        int y = height – (i / (4 * width));

        

        if (CGRectContainsPoint(rect, CGPointMake(x, y))) {

            if (rawData[i] == 255) {

                rawData[i] = 0;

                rawData[i+1] = 255;

                rawData[i+2] = 0;

            } else if (rawData[i + 1] == 255) {

                rawData[i] = 0;

                rawData[i+1] = 0;

                rawData[i+2] = 255;

            } else if (rawData[i + 2] == 255) {

                rawData[i] = 255;

                rawData[i+1] = 0;

                rawData[i+2] = 0;

            }

        }

    }

    

    CGColorSpaceRelease(colorSpace);

    free(rawData);

    [self setNeedsDisplay];

}

– (void)dealloc

{

    CGContextRelease(bitmapContext);

}

@end

@interface ViewController () {

    ColorPaper *colorPaper;

}

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

    colorPaper = [[ColorPaper alloc] initWithFrame:self.view.bounds];

    colorPaper.backgroundColor = [UIColor redColor];

    

    [self.view addSubview:colorPaper];

        

}

– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    CGPoint p = [[touches anyObject] locationInView:colorPaper];

    CGRect rect = CGRectMake(p.x20, p.y20, 40, 40);

    [colorPaper changeColors:rect];

}

– (UIColor *) colorOfPoint:(CGPoint)point

{

    unsigned char pixel[4] = {0};

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast);

    

    CGContextTranslateCTM(context, -point.x, -point.y);

    

    [colorPaper.layer renderInContext:context];

    

    CGContextRelease(context);

    CGColorSpaceRelease(colorSpace);

    UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0];

    

    return color;

}

– (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end