gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:03:57 25 4
gpt4 key购买 nike

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

- (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 进行的乘法运算在计算之前 pixelIndex :

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

我从您的代码中删除了它,它可以正常工作。也改了pointint匹配 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 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 的正确像素颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22174368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com