ios,can';无法获得CGImageRef的正确像素颜色

ios,can';无法获得CGImageRef的正确像素颜色,ios,gradient,uicolor,cgimageref,raw-data,Ios,Gradient,Uicolor,Cgimageref,Raw Data,我做了一个背景,然后是渐变。在那之后,我开始进入上下文。然后我从上下文接收到一个渐变图像,它是正确的,我可以在调试器中看到它。但是,当我尝试获取特定值的像素颜色时,它是不正确的。谢谢你的帮助,谢谢。这是代码 - (UIColor*) getColorForPoint: (CGPoint) point imageWidth: (NSInteger) imageHeight { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(

我做了一个背景,然后是渐变。在那之后,我开始进入上下文。然后我从上下文接收到一个渐变图像,它是正确的,我可以在调试器中看到它。但是,当我尝试获取特定值的像素颜色时,它是不正确的。谢谢你的帮助,谢谢。这是代码

- (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 R G B A 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;
}

我测试了你的代码,问题似乎是在计算
像素索引之前对
point.y
做了一点乘法:

CGFloat y = 100 * point.y / imageHeight;
int pixelIndex = (int)y * 4; // 4 bytes per color

我从你的代码中删除了这个,它可以正常工作。还将
point
更改为
int
以匹配
imageWidth
参数,并将其限制为始终为
0我测试了您的代码,问题似乎是在计算
pixelIndex
之前对
point.y
所做的乘法:

CGFloat y = 100 * point.y / imageHeight;
int pixelIndex = (int)y * 4; // 4 bytes per color

我从你的代码中删除了这个,它可以正常工作。还将
更改为
int
以匹配
imageWidth
参数,并将其限制为始终为
0太好了,很高兴我能提供帮助。你能考虑接受我的回答是否正确?太好了,很高兴我能帮上忙。你能考虑接受我的答案是否正确?