使用CGBitmapContextCreate从像素数据创建图像

时间:2014-04-23 14:50:31

标签: objective-c macos image-processing

我正在尝试编写可以将现有图像裁剪到某个指定大小/区域的代码。我正在使用DICOM图像,我使用的API允许我直接获取像素值。我已将图像中感兴趣区域的像素值放入浮点数组中(dstImage,如下)。

我遇到麻烦的地方是使用此像素数据实际构建/创建新的裁剪图像文件。源图像是灰度图像,但我在网上找到的所有示例(如this one)都用于RGB图像。我尝试按照该链接中的示例,调整灰度并尝试许多不同的值,但我继续在CGBitmapContextCreate代码行上获得错误,但仍然不清楚这些值应该是什么。

源图像的强度值高于255,所以我的印象是这不是8位灰度,而是16位灰度。

这是我的代码:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

CGContextRef context;
context = CGBitmapContextCreate(dstImage, // pixel data from the region of interest
                                dstWidth, // width of the region of interest
                                dstHeight, // height of the region of interest
                                16, // bits per component
                                2 * dstWidth, // bytes per row
                                colorSpace,
                                kCGImageAlphaNoneSkipLast);

CFRelease(colorSpace);

CGImageRef cgImage = CGBitmapContextCreateImage(context);
CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
                                             CFSTR("test.png"),
                                             kCFURLPOSIXPathStyle,
                                             false);
CFStringRef type = kUTTypePNG;
CGImageDestinationRef dest = CGImageDestinationCreateWithURL(url,
                                                             type,
                                                             1,
                                                             0);
CGImageDestinationAddImage(dest,
                           cgImage,
                           0);
CFRelease(cgImage);
CFRelease(context);
CGImageDestinationFinalize(dest);
free(dstImage);

我一直收到的错误是:

CGBitmapContextCreate: unsupported parameter combination: 16 integer bits/component; 32 bits/pixel; 1-component color space; kCGImageAlphaNoneSkipLast; 42 bytes/row.

最终目标是从dstImage中的像素数据创建图像文件并将其保存到硬盘驱动器。非常感谢您的帮助,以及如何确定我应该在CGBitmapContextCreate电话中使用的值。

谢谢

1 个答案:

答案 0 :(得分:0)

首先,您应该熟悉Quartz 2D Programming Guide:Graphics Contexts的"Supported Pixel Formats" section

如果您的图像数据是float值的数组,那么它是每个组件32位,而不是16.因此,您必须使用kCGImageAlphaNone | kCGBitmapFloatComponents

但是,我相信Core Graphics会将浮点组件解释为介于0.0和1.0之间。如果您的值不在此范围内,则可能需要使用(value - minimumValue) / (maximumValue - minimumValue)之类的内容进行转换。另一种方法是使用CGColorSpaceCreateCalibratedGray()或使用CGImage创建CGImageCreate()并指定适当的decode参数,然后使用CGBitmapContextCreateImage()创建一个位图上下文

事实上,如果你没有绘制到位图上下文中,那么你应该改为创建一个CGImage