前の質問への回答に基づいて、ピクセルデータを抽出するためのカテゴリをUIImageViewに作成しました。これはシミュレーターでは正常に機能しますが、デバイスにデプロイされた場合は機能しません。常にではないことを言う必要があります-奇妙なことは、point.x == point.y;の場合、正しいピクセルカラーをフェッチすることです。それ以外の場合は、ミラーリングされているかのように、その線の反対側のピクセルのピクセルデータが得られます。(したがって、画像の右下隅にあるピクセルをタップすると、左上隅にある対応するピクセルのピクセルデータが得られますが、左下隅にあるピクセルをタップすると、正しいピクセルの色が返されます)。タッチ座標(CGPoint)は正しいです。
私は何が間違っているのですか?
これが私のコードです:
@interface UIImageView (PixelColor)
- (UIColor*)getRGBPixelColorAtPoint:(CGPoint)point;
@end
@implementation UIImageView (PixelColor)
- (UIColor*)getRGBPixelColorAtPoint:(CGPoint)point
{
UIColor* color = nil;
CGImageRef cgImage = [self.image CGImage];
size_t width = CGImageGetWidth(cgImage);
size_t height = CGImageGetHeight(cgImage);
NSUInteger x = (NSUInteger)floor(point.x);
NSUInteger y = height - (NSUInteger)floor(point.y);
if ((x < width) && (y < height))
{
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef bitmapData = CGDataProviderCopyData(provider);
const UInt8* data = CFDataGetBytePtr(bitmapData);
size_t offset = ((width * y) + x) * 4;
UInt8 red = data[offset];
UInt8 blue = data[offset+1];
UInt8 green = data[offset+2];
UInt8 alpha = data[offset+3];
CFRelease(bitmapData);
color = [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f];
}
return color;
}