0

我正在使用本教程中的 UIImage 类别方法根据点击的位置获取 UIImage 中特定像素的颜色。这是一个灰度图像,完全不透明。我在这里复制了方法:

- (UIColor *)colorAtPoint:(CGPoint)pixelPoint {
    if (pixelPoint.x > self.size.width || pixelPoint.y > self.size.height) {
        return nil;
    }

    CGDataProviderRef provider = CGImageGetDataProvider(self.CGImage);
    CFDataRef pixelData = CGDataProviderCopyData(provider);
    const UInt8* data = CFDataGetBytePtr(pixelData);

    int numberOfColorComponents = 4;
    float x = pixelPoint.x;
    float y = pixelPoint.y;
    float w = self.size.width;
    int pixelInfo = ((w * y) + x) * numberOfColorComponents;

    UInt8 red = data[pixelInfo];  // <--- CRASH, if tapped in lower 2/3 of image
    UInt8 green = data[(pixelInfo + 1)];
    UInt8 blue = data[pixelInfo + 2];
    UInt8 alpha = data[pixelInfo + 3];
    CFRelease(pixelData);

    // RGBA values range from 0 to 255
    return [UIColor colorWithRed:red/255.0
                           green:green/255.0
                            blue:blue/255.0
                           alpha:alpha/255.0];
}

当我在图像的顶部三分之一内点击时,它可以完美运行。但是当我点击图像的下三分之二(左右)时,它每次都在UInt8 red我上面提到的那条线上崩溃。日志中没有任何内容,但我在该行收到红色EXC_BAD_ACCESS警告。

谁能帮助我了解可能出了什么问题,以及如何解决?

编辑:从一系列水龙头中 记录datapixelInfo值似乎没有提供任何有用的信息:

 NSLog(@"Data: %d, PixelInfo: %d", data, pixelInfo);

Results:
 Data: 134430720, PixelInfo: 594858
 Data: 134430720, PixelInfo: 650668
 Data: 134430720, PixelInfo: 688389
 Data: 134430720, PixelInfo: 633472
 Data: 134430720, PixelInfo: 597113
 Data: 134430720, PixelInfo: 579214
 Data: 134430720, PixelInfo: 856866
 Data: 134430720, PixelInfo: 1060593
 Data: 134430720, PixelInfo: 1130469
 Data: 134430720, PixelInfo: 852816
 Data: 134430720, PixelInfo: 1258536
 Data: 134430720, PixelInfo: 906659
 Data: 134430720, PixelInfo: 998548
 Data: 134430720, PixelInfo: 2072007
 Data: 134430720, PixelInfo: 2889998  // <--- CRASH
4

0 回答 0