gpt4 book ai didi

objective-c - CGBitmapContextCreate 返回空;将 rbga 像素数组写入文件

转载 作者:搜寻专家 更新时间:2023-10-30 20:11:06 24 4
gpt4 key购买 nike

我正在尝试使用找到的代码将 RBGA 像素阵列写入文件 here [stackoverflow.com],但它失败了。

我将像素信息存储在 32 位整数的一维数组中,因此此方法的第一位(希望)从 32 位整数中提取相关位,并将它们存储到字符数组中。

运行时,下面的方法 a) 打印我们没有创建图像(CGBitmapContextCreateImage(bitmapContext) 返回 NULL)和 b)在尝试释放图像时死掉(RayTracerProject[33126] <Error>: CGBitmapContextCreateImage: invalid context 0x0
ImageIO: <ERROR> CGImageDestinationAddImage image parameter is nil
),这是有道理的,因为 cgImage一片空白。

方法:

-(void) write{

char* rgba = (char*)malloc(width*height);
for(int i=0; i < width*height; ++i) {
rgba[4*i] = (char)[Image red:pixels[i]];
rgba[4*i+1] = (char)[Image green:pixels[i]];
rgba[4*i+2] = (char)[Image blue:pixels[i]];
rgba[4*i+3] = (char)[Image alpha:pixels[i]];
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext = CGBitmapContextCreate(
rgba,
width,
height,
8, // bitsPerComponent
width, // bytesPerRow
colorSpace,
kCGImageAlphaNoneSkipLast);

CFRelease(colorSpace);

CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext);

if ( cgImage == NULL )
printf("Couldn't create cgImage correctly").

CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("image.png"), kCFURLPOSIXPathStyle, false);

CFStringRef type = kUTTypePNG; // or kUTTypeBMP if you like
CGImageDestinationRef dest = CGImageDestinationCreateWithURL(url, type, 1, 0);

CGImageDestinationAddImage(dest, cgImage, 0);

CFRelease(cgImage);
CFRelease(bitmapContext);
CGImageDestinationFinalize(dest);
free(rgba);
};

为了完整起见,我的位移方法:

// Extract the 8-bit red component from a 32bit color integer. 
+(int) red:(int) color{
return (color >> 16) & 0xff;
};

// Extract the 8-bit green component from a 32bit color integer.
+(int) green:(int) color{
return (color >> 8) & 0xff;
};

// Extract the 8-bit blue component from a 32bit color integer.
+(int) blue:(int) color{
return (color & 0xff);
};

// Extract the 8-bit alpha component from a 32bit color integer.
+(int) alpha:(int) color{
return (color >> 24) & 0xff;
};

根据找到的文档here [developer.apple.com],CGBitmapContextCreateImage将返回 A new bitmap context, or NULL if a context could not be created ,但不会帮助我理解为什么无法创建上下文。

我做错了什么? [此外,如果有一种更聪明的方法可以在 Objective-C 中将像素数组写入文件,我就不会受限于这种特殊的做事方式——这个项目是我几年前做的 Java 项目的一个端口- 我使用了 FileOutputStream,但在 Objective-C 中找不到等效项]。

最佳答案

我现在让它工作 - 发布它以防有一天其他人发现它有用。

上面的代码有一些错误 - 例如,在调用 CGBitmapContextCreate 时,我没有使用 width*4 作为每行的字节数,并且我的 rgba 数组比它应该的小了 4 倍。下面的代码运行,虽然我不知道图像保存到哪里(我将硬编码路径,直到我弄清楚)。

-(void) write{

//printf("First pixel is: %d\n", pixels[0]);
// RGBA array needs to be 4x pixel array - using 4bytes per int.
char* rgba = (char*)malloc(width*height*4);
//printf("Size of char array: %d\n", width*height*4);

for(int i=0; i < width*height; ++i) {
rgba[4*i] = (char)[Image red:pixels[i]];
rgba[4*i+1] = (char)[Image green:pixels[i]];
rgba[4*i+2] = (char)[Image blue:pixels[i]];
rgba[4*i+3] = (char)[Image alpha:pixels[i]];
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext = CGBitmapContextCreate(
rgba,
width,
height,
8, // bitsPerComponent
width*4, // bytesPerRow (4x larger then width)
colorSpace,
kCGImageAlphaNoneSkipLast);

CFRelease(colorSpace);

CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext);

/*if ( cgImage == NULL )
printf("Couldn't create cgImage correctly");
else
printf("Has been created correctly");
*/
CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("image.png"), kCFURLPOSIXPathStyle, false);

CFStringRef type = kUTTypePNG; // or kUTTypeBMP if you like
CGImageDestinationRef dest = CGImageDestinationCreateWithURL(url, type, 1, 0);

CGImageDestinationAddImage(dest, cgImage, 0);

CFRelease(cgImage);
CFRelease(bitmapContext);
CGImageDestinationFinalize(dest);
free(rgba);
};

关于objective-c - CGBitmapContextCreate 返回空;将 rbga 像素数组写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8504745/

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