我想创建在ios中打开.dcm图像的应用。任何人都可以告诉我如何在ios app.its中打开.dcm图像,例如只打开.dcm图像的图像查看器。 你们有任何想法吗???应该感谢你的帮助。 感谢,
答案 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规范可在线免费获取。