2 つの UIView があり、ピクセル単位で比較したいと考えています。ここの回答に基づいて、UIViewでピクセルの色を取得する方法は? 私は次の方法を持っています。
- (UIColor *)colorOfPoint:(CGPoint)point view:(UIView *)view {
unsigned char pixel[4] = {0};
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast);
CGContextTranslateCTM(context, -point.x, -point.y);
[view.layer renderInContext:context];
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
//NSLog(@"pixel: %d %d %d %d", pixel[0], pixel[1], pixel[2], pixel[3]);
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)comparePixels {
for (int height = 0; height <= view1.frame.size.height; height++) {
for (int width = 0; width <= view1.frame.size.width; width++) {
UIColor *view1Color = [self colorOfPoint:CGPointMake(height, width) view:view1];
UIColor *view2Color = [self colorOfPoint:CGPointMake(height, width) view:view2];
if (![view1Color isEqual:view2Color]) {
NSLog(@"%d %d", height, width);
}
}
}
}
2 つの質問があります。1) このアプローチは非常に遅いです。もっと速い方法はありますか?2) 何度か繰り返した後、[view.layer renderInContext:context] 行で exec bad access が発生することがあります。常に発生するとは限りませんが、比較するピクセル数が多い場合にのみ発生します。