如何使用Objective C在ios app中打开.dcm图像

时间:2016-01-05 12:49:27

标签: ios objective-c dicom

我想创建在ios中打开.dcm图像的应用。任何人都可以告诉我如何在ios app.its中打开.dcm图像,例如只打开.dcm图像的图像查看器。 你们有任何想法吗???应该感谢你的帮助。 感谢,

2 个答案:

答案 0 :(得分:0)

C ++ Dicom库Imebra可以在iOS上编译,并从Objective-C应用程序中引用。

很少有Objective-C助手可以将std :: wstring转换为NSString,从Imebra Image类转换为UIImage或NSSimage。

引用Imebra库的所有文件必须具有扩展名.mm(混合C ++ / ObjectiveC,与单个.m相反,用于纯Objective-C文件)。

打开文件:

using namespace puntoexe;

ptr<stream> readStream(new stream());
readStream->openFile(NSStringToStringW(@"d:\\test.dcm"), std::ios::in);

阅读Dicom数据集:

ptr<streamReader> reader(new streamReader(readStream));
ptr<imebra::dataSet> testDataSet = imebra::codecs::codecFactory::getCodecFactory()->load(reader);

获取第一张图片

ptr<imebra::image> firstImage = testDataSet->getModalityImage(0);

将图像转换为UIImage

UIImage* iosIMage = getImage(firstImage, ptr<imebra::transforms::transform>(0));

获取患者姓名:

NSString* patientNameCharacter = StringWToNSString(testDataSet->getString(0x0010, 0, 0x0010, 0));
NSString* patientNameIdeographic = StringWToNSString(testDataSet->getString(0x0010, 0, 0x0010, 1));

更新

上面的代码适用于Imebra的旧版本。

Imebra V4的API略有不同(detailed explanation):

std::unique_ptr<imebra::DataSet> loadedDataSet(imebra::CodecFactory::load("DicomFile.dcm"));

// Retrieve the first image (index = 0)
std::unique_ptr<imebra::Image> image(loadedDataSet->getImageApplyModalityTransform(0));

// The transforms chain will contain all the transform that we want to
// apply to the image before displaying it
imebra::TransformsChain chain;

if(imebra::ColorTransformsFactory::isMonochrome(image->getColorSpace())
{
    // Allocate a VOILUT transform. If the DataSet does not contain any pre-defined
    //  settings then we will find the optimal ones.
    VOILUT voilutTransform;

    // Retrieve the VOIs (center/width pairs)
    imebra::vois_t vois = loadedDataSet->getVOIs();

    // Retrieve the LUTs
    std::list<std::shared_ptr<imebra::LUT> > luts;
    for(size_t scanLUTs(0); ; ++scanLUTs)
    {
        try
        {
            luts.push_back(loadedDataSet->getLUT(imebra::TagId(imebra::tagId_t::VOILUTSequence_0028_3010), scanLUTs));
        }
        catch(const imebra::MissingDataElementError&)
        {
            break;
        }
    }

    if(!vois.empty())
    {
        voilutTransform.setCenterWidth(vois[0].center, vois[0].width);
    }
    else if(!luts.empty())
    {
        voilutTransform.setLUT(*(luts.front().get()));
    }
    else
    {
        voilutTransform.applyOptimalVOI(image, 0, 0, width, height);
    }

    chain.add(voilutTransform);
}

// If the image is monochromatic then now chain contains the VOILUT transform
// We create a DrawBitmap that always apply the chain transform before getting the RGB image
imebra::DrawBitmap draw(chain);

// Get an NSImage (or UIImage on iOS)
UIImage* uiImage = getImebraImage(*ybrImage, draw);

答案 1 :(得分:0)

dcmtk也可以为ios构建。我测试了一些示例应用程序并将我自己的构建移植到ios。此外,您可以构建自己的dicom解析器。您可以像计算机上的任何其他文件一样打开.dcm文件,并使用您自己的代码处理字节。 DICOM规范可在线免费获取。