特定のポイントの画像のピクセル カラーを取得する方法については、いくつかの質問/回答があります。ただし、これらの回答はすべて、大きな画像 (たとえば、1000 x 1300 のように小さい場合でも) では非常に遅くなります (100 ~ 500 ミリ秒) 。
そこにあるコードサンプルのほとんどは、画像コンテキストを描画します。それらはすべて、実際の抽選が行われるときに時間がかかります。
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage)
これを Instruments で調べると、ソース イメージからデータをコピーすることによって描画が行われていることがわかります。
バイト自体を取得する方が実際にははるかに効率的であることが証明されることを期待して、データを取得する別の方法も試しました。
NSInteger pointX = trunc(point.x);
NSInteger pointY = trunc(point.y);
CGImageRef cgImage = CGImageCreateWithImageInRect(self.CGImage,
CGRectMake(pointX * self.scale,
pointY * self.scale,
1.0f,
1.0f));
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef data = CGDataProviderCopyData(provider);
CGImageRelease(cgImage);
UInt8* buffer = (UInt8*)CFDataGetBytePtr(data);
CGFloat red = (float)buffer[0] / 255.0f;
CGFloat green = (float)buffer[1] / 255.0f;
CGFloat blue = (float)buffer[2] / 255.0f;
CGFloat alpha = (float)buffer[3] / 255.0f;
CFRelease(data);
UIColor *pixelColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
return pixelColor;
この方法では、データ コピーに時間がかかります。
CFDataRef data = CGDataProviderCopyData(provider);
CGImage
私が作成しているインスタンスではなく、ディスクからデータを読み取っているようにも見えます。
さて、この方法は、いくつかの非公式のテストでより優れたパフォーマンスを発揮しますが、それでも私が望んでいるほど高速ではありません. 基礎となるピクセルデータを取得するさらに高速な方法を知っている人はいますか???