在我见过的关于如何写入图像数据的所有GDCM示例中,他们总是将图像卷视为一个整体,内聚的缓冲区。基本结构是这样的:
#include "gdcmImage.h"
#include "gdcmImageWriter.h"
#include "gdcmFileDerivation.h"
#include "gdcmUIDGenerator.h"
int write_image(...)
{
size_t width = ..., height = ..., depth = ...;
auto im = new gdcm::Image;
std::vector<...> buffer;
auto p = buffer.data();
im->SetNumberOfDimensions(3);
im->SetDimension(0, width);
im->SetDimension(1, height);
im->SetDimension(1, depth);
im->GetPixelFormat().SetSamplesPerPixel(...);
im->SetPhotometricInterpretation( gdcm::PhotometricInterpretation::... );
unsigned long l = im->GetBufferLength();
if( l != width * height * depth * sizeof(...) ){ return SOME_ERROR; }
gdcm::DataElement pixeldata( gdcm::Tag(0x7fe0,0x0010) );
pixeldata.SetByteValue( buffer.data(), buffer.size()*sizeof(*buffer.data()) );
im->SetDataElement( pixeldata );
gdcm::UIDGenerator uid;
auto file = new gdcm::File;
gdcm::FileDerivation fd;
const char UID[] = ...;
fd.AddReference( ReferencedSOPClassUID, uid.Generate() );
fd.SetFile( *file );
// If all Code Value are ok the filter will execute properly
if( !fd.Derive() ){ return SOME_ERROR; }
gdcm::ImageWriter w;
w.SetImage( *im );
w.SetFile( fd.GetFile() );
// Set the filename:
w.SetFileName( "some_image.dcm" );
if( !w.Write() ){ return SOME_ERROR; }
return 0;
}我使用这种方法面临的问题是,如果正在制作额外的副本,我需要存储的图像数据量很容易超过可用的系统内存;具体地说,这些是4096×4096×2048个体素的体积,每个体素12位,所以内存中大约有48G的数据。
但是,使用gdcm::DataElement和gdcm::Image::SetDataElement的方法显然会在buffer中创建数据的完整副本,这是很麻烦的。首先,我的成像系统产生的数据并不是作为内聚的、单一的值块驻留在内存中;它被分成多个切片。并且数据总量只适合正在使用一次的系统的内存。
对我来说,一片一片地读取数据是微不足道的,这将显著减少内存需求。然而,我不知所措,GDCM该如何做到这一点。
发布于 2021-06-03 22:16:14
您是否检查了gdcm::FileStreamer:
请参阅位于以下位置的典型设置:
该示例展示了如何创建内存不足的私有元素,但您也可以对公共DataElement执行相同的操作。
一个更复杂的阅读像素数据块写入位置的例子是:
https://stackoverflow.com/questions/67813194
复制相似问题