gpt4 book ai didi

iPhone SDK - <错误> : CGBitmapContextCreate: unsupported color space

转载 作者:行者123 更新时间:2023-12-03 21:04:29 25 4
gpt4 key购买 nike

我能够找到一种方法来帮助我修改应用程序中 UIImage 中像素的 alpha 值,但我遇到了两个错误(第二个错误肯定是由第一个错误引起的)。但是,我无法弄清楚发生了什么。

我的方法:

- (void)modifyAlpha:(int)x and:(int)y {

CGContextRef ctx;
CGImageRef imageRef = [scratchOffImage CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = malloc(height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);

// Now your rawData contains the image data in the RGBA8888 pixel format.
int byteIndex = (bytesPerRow * y) + x * bytesPerPixel;

rawData[byteIndex+3] = (char) (255); //Change the pixel value
ctx = CGBitmapContextCreate(rawData,
CGImageGetWidth( imageRef ),
CGImageGetHeight( imageRef ),
8,
CGImageGetBytesPerRow( imageRef ),
CGImageGetColorSpace( imageRef ),
kCGImageAlphaPremultipliedFirst ); //This line causes an error: incorrect colorspace

imageRef = CGBitmapContextCreateImage (ctx);
UIImage* rawImage = [UIImage imageWithCGImage:imageRef];

CGContextRelease(ctx);

scratchOffImage = rawImage;
[scratchOffImageView setImage:scratchOffImage];

free(rawData);

}

错误:

<Error>: CGBitmapContextCreate: unsupported color space.

正在上线:

ctx = CGBitmapContextCreate(rawData,  ...

然后是第二个错误:

<Error>: CGBitmapContextCreateImage: invalid context 0x0

正在上线:

imageRef = CGBitmapContextCreateImage (ctx);

我的图像包含在我最初通过使用 PNG-8 和透明度作为格式输出 Photoshop 的“保存为网页”功能而制作的 bundle 中。

当我运行首次使用该函数的示例代码时,示例图像工作正常。然而,我的形象却没有。我该如何调试这个?

有人知道如何调试这个吗?我输入的 PNG 格式可能不正确吗?我怎样才能检查这个?

干杯,布雷特

编辑1:原始源代码来自发现的示例here 。该示例显示了到灰度的转换,而我只需要更改 alpha 值。

编辑 2:我尝试将图像保存为 PNG-8 和 PNG-24,但都没有成功。

最佳答案

PNG-8 使用 8 位索引颜色空间。 Quartz 不支持 CGBitmapContext 的索引颜色空间。 CGBitmapContextCreate documentation说“请注意,位图图形上下文不支持索引颜色空间。”

您不想在第二次调用 CGBitmapContextCreate 时传递 CGImageGetColorSpace( imageRef ) 作为颜色空间,而是希望传递在第一次调用中使用的相同颜色空间 (您的 colorSpace 变量)。

无论如何,甚至没有理由创建第二个CGBitmapContext。并且您正在泄漏 CGBitmapContextCreateImage 的结果。只需这样做:

- (void)modifyAlpha:(int)x and:(int)y {

CGImageRef imageRef = [scratchOffImage CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = malloc(height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

// Now your rawData contains the image data in the RGBA8888 pixel format.
int byteIndex = (bytesPerRow * y) + x * bytesPerPixel;

rawData[byteIndex+3] = (char) (255); //Change the pixel value
imageRef = CGBitmapContextCreateImage (context);
CGContextRelease(context);

UIImage* rawImage = [UIImage imageWithCGImage:imageRef];

CGImageRelease(imageRef);

scratchOffImage = rawImage;
[scratchOffImageView setImage:scratchOffImage];

free(rawData);

}

关于iPhone SDK - <错误> : CGBitmapContextCreate: unsupported color space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794218/

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