На основе ответов на a previous question я создал категорию в UIImageView для извлечения данных пикселей. Это отлично работает в симуляторе, но не при развертывании на устройстве. Я должен сказать не всегда - странно, что он получает правильный пиксельный цвет, если point.x == point.y; в противном случае он дает мне пиксельные данные для пикселя на другой стороне этой линии, как бы зеркальные. (Так что нажатие на пиксель в правом нижнем углу изображения дает мне пиксельные данные для соответствующего пикселя в левом верхнем углу, но нажатие на пиксель в нижнем левом углу возвращает правильный цвет пикселя). Координаты касания (CGPoint) верны.Получение пиксельных данных из UIImageView - работает на симуляторе, а не на устройстве
Что я делаю неправильно?
Вот мой код:
@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;
}
вы можете проверить значение self.image.imageOrientation? возможно, что образ, который вы используете, находится в UIImageOrientationLeftMirrored, который будет отражением, которое вы видите, хотя я не знаю, почему это было бы только на устройстве .... –
Это UIImageOrientationUp на обоих симуляторах и устройствах , Я не уверен, что «левое зеркальное отображение» - правильная интерпретация происходящего, потому что отражение (по-видимому) происходит по диагонали y = x, а UIImageOrientationLeftMirrored - это простой поворот всего изображения «90 градусов CCW» согласно к SDK. –
Дополнительная информация: если я поменяю местами вычисления x и y, поведение изменится на противоположное - оно работает на устройстве, но не на симуляторе. (Хотя точное позиционирование на устройстве, кажется, отключено на несколько градусов CCW, но это может быть неточность моего пальца по сравнению с использованием мыши) –