基於對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幾度關閉,但它可能是我的手指與使用鼠標的不精確性) –