タッチしたところの色をピクセル毎に変更してみる
(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.x – 20, p.y – 20, 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