我正在使用本教程中的 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
警告。
谁能帮助我了解可能出了什么问题,以及如何解决?
编辑:从一系列水龙头中 记录data
和pixelInfo
值似乎没有提供任何有用的信息:
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