2

有谁知道如何从 DICOM 文件中提取像素数据并将其传递给 iOS 上的图像查看器?

对不起,如果这是一个简单的问题,但它似乎是我打开的一大罐蠕虫的主要组成部分。

4

3 回答 3

6

我在 iOS 上使用 GDCM。我还没有非常努力地推动它,但到目前为止它运作良好。在这篇关于ITK的优秀文章中,我基本上遵循了破解 XCode 项目以在 iOS 中运行的指示。

这是我为 iOS 编译它的方法:

  1. 从 sourceforge 下载源代码,通过端口安装 cmake。您需要最新版本的 cmake(我使用的是 2.8.2)
  2. 如果源位于名为 gdcm-2.0.17/ 的文件夹中,则在该级别创建另一个目录(例如 gdcmbin),cd 到该目录,然后在终端窗口中输入ccmake -GXCode ../gdcm-2.0.17/ . 这将创建 XCode 项目。当我这样做时,我没有创建任何示例程序或创建共享库(这在 iOS 中不起作用)。只需运行默认值。
  3. 按照 ITK 论文中有关更改构建选项的说明进行操作(第 4 页的步骤 #7)。
  4. 然后使用Clint Harris 博客中的优秀说明将 GDCM 链接到您的项目中
  5. 当您在项目中将标头搜索路径设置为 GDCM 时 - 您必须输入两个路径:blah /gdcm-2.0.17/Source/** 和blah /gdcmbin/**。第一个路径上的尾随“/Source”是必要的 - 否则您会得到不适合您的体系结构的标头。
  6. 一个小故障(烦人,但还没有花时间弄清楚):当您从模拟器切换到设备时(反之亦然),您会遇到一堆链接错误。这是因为 gdcm 项目不会将输出放入不同目标的不同目录中。所以 - 当你切换时,在 gdcm 项目中运行干净并重建。我可能很快就会对此感到恼火以改变它:-)。

这是您如何调用库并将结果放入 Objective-C 字典的粗略片段:

NSMutableDictionary * imageDictionary = [[NSMutableDictionary alloc] initWithCapacity:40];
// The output of gdcm::Reader is a gdcm::File
gdcm::File &file = reader.GetFile();

// the dataset is the the set of element we are interested in:
gdcm::DataSet &ds = file.GetDataSet();
const Tag studyInstance(0x0020,0x000d); // Study Instance UID
const DataElement &dicomVal = ds.GetDataElement(studyInstance);
std::string stringVal( dicomVal.GetByteValue()->GetPointer(), dicomVal.GetByteValue()->GetLength() );
NSString *val = [NSString stringWithCString:stringVal.c_str() encoding:[NSString defaultCStringEncoding]];
[imageDictionary setObject:val forKey:@"studyInstanceUID"];

(注意:这是在一个混合了 C++ 和 ObjectiveC 的 *.mm 文件中)

于 2011-03-19T14:10:27.617 回答
0

Imebra有一个 Objective-C 包装器,它也可以与 Swift 一起使用。

#import "imebraobjc/imebra.h"

// Get the DICOM dataset from file
NSError* error = nil;
ImebraDataSet* pDataSet = [ImebraCodecFactory loadFromFile:@"test.dcm" error:&error]

// CHeck the patient name (automatically convert from DICOM charsets to UTF-8)
NSString* checkPatientName = [pDataSet getString:[[ImebraTagId alloc] initWithGroup:0x10 tag:0x10] elementNumber:0 error:&error]; // Automatically converted to UTF-8 if necessary

// Get the frame 0
ImebraImage* pCheckImage = [pDataSet getImageApplyModalityTransform:0 error:&error];

// Get the image data
ImebraReadingDataHandlerNumeric* readingDataHandler = [pCheckImage getReadingDataHandler:&error];

// Scan the pixels. Access the data handler memory for faster data access
for(unsigned int pixel(0); pixel != readingDataHandler.size; ++pixel)
{
    unsigned int pixelValue = [readingDataHandler getUnsignedLong:pixel error:&error];
}

ImebraDrawBitmap* pDrawBitmap = [[ImebraDrawBitmap alloc] init];

// Obtain a NSImage (UIImage on iOS)
NSImage* pNsImage = [pDrawBitmap getImebraImage:pCheckImage error:&pError];
于 2019-11-13T09:50:46.710 回答
-1

如果您想查找 DICOM 软件,请访问idoimaging.com,这是一个医学成像软件交换所。您可以选择您的平台、输入格式、输出格式、语言等。iOS 并未作为格式列出,但其中列出的大部分软件都有源代码,以库形式有用,并且可用于 MacOS X。例如,我选择了:

  • 输入格式:DICOM
  • 平台:麦金塔
  • 语言:C

并找到了几个包。鉴于 MacOS 和 iOS 之间的相似之处以及其中一些是跨平台且包含源代码的事实,让其中一个在 iOS 上运行应该不会太难。

于 2011-03-12T14:19:02.247 回答