我正在尝试编写可以将现有图像裁剪到某个指定大小/区域的代码。我正在使用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
电话中使用的值。
谢谢
答案 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
。