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" на ноль. Когда я делаю это, я успешно создаю изображение, но оно явно неправильно отображается (вы едва различаете исходное изображение). Пожалуйста, некоторые предложения! Я долго пытался заставить это работать и проверил переполнение стека и сеть (много раз). Большое спасибо за любую помощь!
РЕШЕНИЕ:
После очень полезных советов от службы поддержки LEADTOOLS я смог решить свою проблему. Вот фрагмент кода, который работает (при условии, что DICOM-образ MONOCHROME2):
// 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 ответ
Важно знать о синтаксисе передачи (0002:0010) и количестве кадров в наборе данных. Также попробуйте получить значение длины и VR для элемента Pixel Data (7FE0:0010). Используя значение длины элемента данных пикселя, вы сможете проверить свой расчет для несжатого изображения.
Что касается отображения изображения, вам также понадобятся значения для High Bit (0028:0102) и Pixel Presentation (0028:0103). Изображение может быть 16-битным, 12-битным, старшим битом, равным 15, и иметь одну выборку на пиксель. Это означает, что 4 значащих бита каждого слова не содержат пиксельных данных. Представление пикселей при значении 1 означает, что знаковый бит является старшим битом в выборке пикселей. Кроме того, многие из них должны применять модальное преобразование LUT (изменение масштаба наклона и пересечение изменения масштаба для линейного преобразования), когда оно присутствует в наборе данных, для подготовки данных к отображению. В конце вы применяете преобразование VOI LUT (Центр окна и Ширина окна) для отображения изображения.