Objective c NSBitmapImageRep:值集不一致

Objective c NSBitmapImageRep:值集不一致,objective-c,cocoa,dicom,nsbitmapimagerep,Objective C,Cocoa,Dicom,Nsbitmapimagerep,我正在尝试读取12位灰度DICOM:单色图像。我可以很好地阅读DICOM RGB文件。当我尝试将灰度图像加载到NSBitmapImageRep时,会收到以下错误消息: Inconsistent set of values to create NSBitmapImageRep 我有以下代码片段: NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes :

我正在尝试读取12位灰度DICOM:单色图像。我可以很好地阅读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设置为零。当我这样做的时候,我成功地生成了一个图像,但是它显然被错误地渲染了,你几乎看不出原始图像。请给我一些建议!!我已经尝试了很长一段时间,以使这项工作,并检查了堆栈溢出和网络多次。非常感谢您的帮助

解决方案:

在LEADTOOLS支持部门提供了非常有用的建议之后,我终于解决了我的问题。以下是假定为单色2 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;

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

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

在大多数移动和桌面操作系统上,12 bpp灰度不是本机像素格式。连接到大多数计算机/移动设备的显示器只能显示8位灰色。您可以尝试告诉它有16位像素,然后将数据左移4位。正确的显示方式是将其呈现为8-bpp的灰色,并允许用户调整级别/窗口以查看他们需要查看的内容。非常感谢您的回复。传输语法为Little Endian Explicit 1.2.840.10008.1.2.1。未指定帧数,但假定为一帧。像素数据的值长度是我用来验证图像长度和格式的项目之一。高位为11,像素表示为0。虽然,我仍然没有发现任何与我上面指定的参数不一致的地方,但我相信解决方案是使bitsPerSample=16没有错误,然后对图像进行WW/WL。我还没有试过,但我相信这会解决我的问题,我希望!!。