iOS,无法获得CGImageRef的正确像素颜色 [英] ios, can't get correct pixel color of CGImageRef

查看:382
本文介绍了iOS,无法获得CGImageRef的正确像素颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我做了一个背景,然后是一个渐变.之后,我将参考上下文.然后,我从上下文中收到一个渐变图像,它是正确的,我可以在调试器中看到它.但是,当我尝试获取特定值的像素颜色时,这是不正确的.感谢您的帮助,谢谢.这是代码.

I made a context, then a gradient. After that I am drawing to the context. Then I receive an gradiented image from context and it is correct, I can see it in the debugger. But when I try to get a pixel color for a specific value it isn't correct. I appreciate any help, thanks. Here is the code.

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

推荐答案

我测试了您的代码,问题似乎是在计算pixelIndex之前对point.y进行了乘法运算:

I tested your code and the problem seems to be the bit of multiplication done to point.y before calculating pixelIndex:

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

我从您的代码中删除了此代码,并且它可以正常工作.还将point更改为int以匹配imageWidth参数,并将其始终限制为0 <= point < imageWidth:

I removed this from your code, and it works. Also changed point to an int to match the imageWidth parameter, and bounded it to always be 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 R G B A 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;
}

这篇关于iOS,无法获得CGImageRef的正确像素颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆