Я использую библиотеку Imerba для чтения файлов DICOM. Мне нужно получить доступ к пикселям, чтобы я мог изменять их на низком уровне. Документация гласит: "Чтобы получить доступ к пикселям изображения, вы должны получить обработчик данных", и есть пример:
imbxUint32 rowSize, channelPixelSize, channelsNumber;
ptr<imebra::handlers::dataHandlerNumericBase> myHandler = presentationImage->getDataHandler(true, &rowSize, &channelPixelSize, &channelsNumber);
// Retrieve the image size in pixels
imbxUint32 sizeX, sizeY;
presentationImage->getSize(&sizeX, &sizeY);
// Scan all the rows
imbxUint32 index(0);
for(imbxUint32 scanY = 0; scanY < sizeY; ++scanY)
{
// Scan all the columns
for(imbxUint32 scanX = 0; scanX < sizeX; ++scanX)
{
// Scan all the channels
for(imbxUint32 scanChannel = 0; scanChannel < channelsNumber; ++scanChannel)
{
imbxInt32 channelValue = myHandler->getSignedLong(index++);
// Do something with the channel value
//--------------------------------------
}
}
} Мне нужно, чтобы пиксели объекта presentationImage были изменены. Я попытался изменить его так:
myHandler->setSignedLong(index,255);
но он не меняет объект presentationImage, и теперь я уверен. Документация Imebra имеет только три примера, а описание классов и методов немного грубо. Google ничего не знает. Как изменить значения пикселей в этом объекте?
Когда вы изменяете буфер, вы изменяете несжатое изображение: исходная структура dicom все еще содержит сжатое изображение.
Чтобы заменить изображение в файле Dicom, вы должны вернуть изображение в набор данных с помощью dataset::setImage
после того, как dataHandler
выходит из области видимости (данные записываются в изображение только при уничтожении dataHandler
)
presentationImage
? why myHandler->setSignedLong(index,255);
не меняет presentationImage
?
true
в функциюgetDataHandler
. Из документов -true if the application wants to write into the buffer, false otherwise.
Вы пробовали, чтобы это звучалоtrue
в этом звонке?