NSBitmapImageRep:值集不一致

时间:2015-03-01 15:45:19

标签: objective-c cocoa dicom nsbitmapimagerep

我正在尝试读取12位灰度(DICOM:MONOCHROME2)图像。我可以很好地阅读DICOM RGB文件。当我尝试将灰度图像加载到NSBitmapImageRep时,我收到以下错误消息:

Inconsistent set of values to create NSBitmapImageRep

我有以下代码片段:

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                         initWithBitmapDataPlanes : nil
                         pixelsWide               : width
                         pixelsHigh               : height
                         bitsPerSample            : bitsStored
                         samplesPerPixel          : 1
                         hasAlpha                 : NO
                         isPlanar                 : NO
                         colorSpaceName           : NSCalibratedWhiteColorSpace
                         bytesPerRow              : width * bitsAllocated / 8
                         bitsPerPixel             : bitsAllocated];

使用这些值:

width         = 256
height        = 256
bitsStored    = 12
bitsAllocated = 16

对我来说似乎没有什么不一致。我已经验证图像是:宽*高* 2的长度。所以我很确定它采用的是2字节灰度格式。我尝试了很多参数,但没有任何效果。如果我将“bitsPerSample”更改为16,则错误消息消失,但我得到一个纯黑色图像。我能够取得的最接近的成功是将“bitsPerPixel”设置为零。当我这样做时,我成功地生成了一个图像,但它显然被错误地渲染(你几乎看不出原始图像)。请一些建议!!我已经尝试了很长时间才能使用它并检查了堆栈溢出和Web(很多次)。非常感谢您的帮助!

解决方案:

在LEADTOOLS支持的非常有用的建议之后,我能够解决我的问题。这是有效的代码片段(假设MONOCHROME2 DICOM图像):

// If, and only if, MONOCHROME2:
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc]
                              initWithBitmapDataPlanes : &pixelData
                              pixelsWide               : width
                              pixelsHigh               : height
                              bitsPerSample            : bitsAllocated /*bitsStored-this will not work*/
                              samplesPerPixel          : samplesPerPixel
                              hasAlpha                 : NO
                              isPlanar                 : NO
                              colorSpaceName           : NSCalibratedWhiteColorSpace
                              bytesPerRow              : width * bitsAllocated / 8
                              bitsPerPixel             : bitsAllocated];

int     scale = USHRT_MAX / largestImagePixelValue;
uint16_t *ptr = (uint16_t *)imageRep.bitmapData;
for (int i = 0; i < width * height; i++) *ptr++ *= scale;

1 个答案:

答案 0 :(得分:0)

了解传输语法(0002:0010)和数据集中的帧数非常重要。此外,尝试获取像素数据(7FE0:0010)元素的值长度和VR。使用像素数据元素的值长度,您将能够验证未压缩图像的计算。

至于显示图像,您还需要高位(0028:0102)和像素表示(0028:0103)的值。图像可以是16位分配,12位存储,高位设置为15,每个像素有一个样本。这意味着每个字的有效位不包含像素数据。设置为1时的像素表示意味着符号位是像素采样中的高位。 此外,当数据集中存在用于准备显示数据时,您需要应用模态LUT变换(重新缩放斜率和线性变换的重新缩放截距)。最后,应用VOI LUT变换(窗口中心和窗口宽度)以显示图像。