Abrufen von Pixeldaten aus UIImageView - Funktioniert auf Simulatoren, nicht auf Geräten

Basierend auf den Antworten aufeine frühere FrageIch habe in UIImageView eine Kategorie zum Extrahieren von Pixeldaten erstellt. Dies funktioniert im Simulator einwandfrei, jedoch nicht, wenn es auf dem Gerät bereitgestellt wird. Sollte ich nicht sagenimmer - Das Seltsame ist, dass die richtige Pixelfarbe abgerufen wird, wenn point.x == point.y; Andernfalls erhalte ich Pixeldaten für ein Pixel auf der anderen Seite dieser Zeile, als wäre es gespiegelt. (Wenn Sie auf ein Pixel in der unteren rechten Ecke des Bildes tippen, werden die Pixeldaten für ein entsprechendes Pixel in der oberen linken Ecke angezeigt. Wenn Sie jedoch auf ein Pixel in der unteren linken Ecke tippen, wird die richtige Pixelfarbe zurückgegeben.) Die Berührungskoordinaten (CGPoint) sind korrekt.

Was mache ich falsch?

Hier ist mein Code:

@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;
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage