ios,无法获得CGImageRef的正确像素颜色
我创建了一个上下文,然后是一个渐变。 在那之后,我正在绘制上下文。 然后我从上下文接收到渐变的图像并且它是正确的,我可以在调试器中看到它。 但是,当我尝试获取特定值的像素颜色时,它是不正确的。 我感谢任何帮助,谢谢。 这是代码。
- (UIColor*) getColorForPoint: (CGPoint) point imageWidth: (NSInteger) imageHeight { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // create a gradient CGPoint startPoint = CGPointMake(0, 0); CGPoint endPoint = CGPointMake(imageHeight, 0); // create a bitmap context to draw the gradient to, 1 pixel high. CGContextRef context = CGBitmapContextCreate(NULL, imageHeight, 1, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); // draw the gradient into it CGContextAddRect(context, CGRectMake(0, 0, imageHeight, 1)); CGContextClip(context); CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); // Get our RGB bytes into a buffer with a couple of intermediate steps... // CGImageRef -> CFDataRef -> byte array CGImageRef cgImage = CGBitmapContextCreateImage(context); CGDataProviderRef provider = CGImageGetDataProvider(cgImage); CFDataRef pixelData = CGDataProviderCopyData(provider); // cleanup: CGColorSpaceRelease(colorSpace); CGImageRelease(cgImage); CGContextRelease(context); const UInt8* data = CFDataGetBytePtr(pixelData); // we got all the data we need. // bytes in the data buffer are a succession of RGBA bytes CGFloat y = 100 * point.y / imageHeight; int pixelIndex = (int)y * 4; // 4 bytes per color UIColor *color = [UIColor colorWithRed:data[pixelIndex + 0]/255.0f green:data[pixelIndex + 1]/255.0f blue:data[pixelIndex + 2]/255.0f alpha:data[pixelIndex + 3]/255.0f]; // done fetching color data, finally release the buffer CGDataProviderRelease(provider); return color; }
我测试了你的代码,问题似乎是在计算pixelIndex
之前对point.y
进行了point.y
乘法运算:
CGFloat y = 100 * point.y / imageHeight; int pixelIndex = (int)y * 4; // 4 bytes per color
我从你的代码中删除了它,它的工作原理。 也改为point
一个int
来匹配imageWidth
参数,并将其限制为始终为0 <= point < imageWidth
:
- (UIColor*) getColorForPoint: (NSInteger) point imageWidth: (NSInteger) imageWidth { point = MIN(imageWidth - 1, MAX(0, point)); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // create a gradient CGPoint startPoint = CGPointMake(0, 0); CGPoint endPoint = CGPointMake(imageWidth, 0); // create a bitmap context to draw the gradient to, 1 pixel high. CGContextRef context = CGBitmapContextCreate(NULL, imageWidth, 1, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); // draw the gradient into it CGContextAddRect(context, CGRectMake(0, 0, imageWidth, 1)); CGContextClip(context); CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); // Get our RGB bytes into a buffer with a couple of intermediate steps... // CGImageRef -> CFDataRef -> byte array CGImageRef cgImage = CGBitmapContextCreateImage(context); CGDataProviderRef provider = CGImageGetDataProvider(cgImage); CFDataRef pixelData = CGDataProviderCopyData(provider); // cleanup: CGColorSpaceRelease(colorSpace); CGImageRelease(cgImage); CGContextRelease(context); const UInt8* data = CFDataGetBytePtr(pixelData); // we got all the data we need. // bytes in the data buffer are a succession of RGBA bytes int pixelIndex = (int)point * 4; // 4 bytes per color UIColor *color = [UIColor colorWithRed:data[pixelIndex + 0]/255.0f green:data[pixelIndex + 1]/255.0f blue:data[pixelIndex + 2]/255.0f alpha:data[pixelIndex + 3]/255.0f]; // done fetching color data, finally release the buffer CGDataProviderRelease(provider); return color; }