Objective c NSBitmapImageRep:值集不一致
我正在尝试读取12位灰度DICOM:单色图像。我可以很好地阅读DICOM RGB文件。当我尝试将灰度图像加载到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 :
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。我还没有试过,但我相信这会解决我的问题,我希望!!。