DICOM文件编程

{

const void *pixel; // pointer to pixel data, one byte per pixel unsigned long width; // width of image bitmap unsigned long height; // height of image bitmap if (pstate.getPixelData(pixel, width, height).good()) {

/* do something useful with the pixel data */ }

pstate.detachImage(); // release connection between GSPS and image } } }

九、dcmsign程序包

dcmsign是一个数字签名库和可用工具。这个模块包含了一些类,以创建DICOM数据集中的数字签名,并验证和删除签名。这个模块需要扩展的OpenSSL库的支持。

主要接口:

--DcmSignature: this class provides the main interface to the dcmsign module - it allows to create, examine and verify digital signatures in DICOM datasets or items. The methods in this class do not handle digital signatures embedded in sequence items within the dataset, other than providing helper functions that allow to locate and attach the sub-items separately. 在dcsignat.h中定义。

--SiSecurityProfile: 所有安全框架的抽象基类。abstract base class for all security profiles. 在sisprof.h文件中定义。

--SiCertificate: a class representing X.509 public key certificates. 在sicert.h文件中定义。 --SiPrivateKey: a class representing a private key. 在siprivat.h文件中定义。

--SiMAC: a base class for all classes that implement hash functions. 在simac.h文件中定义。

工具:

dcmsign: Sign and Verify DICOM Files 举例:

--验证一个DICOM文件中的所有签名。 DcmFileFormat fileformat;

if (fileformat.loadFile(\{

int counter = 0; // counts the signatures in the DICOM file int corrupt_counter = 0; // counts signatures that failed verification DcmDataset *dataset = fileformat.getDataset();

DcmStack stack; // stores current location within file DcmSignature signer; // signature handler

DcmItem *sigItem = DcmSignature::findFirstSignatureItem(*dataset, stack); while (sigItem) // browse through items that contain digital signatures { signer.attach(sigItem); // each item may contain multiple signatures for (unsigned long l=0; l < signer.numberOfSignatures(); ++l) {

if (signer.selectSignature(l).good()) {

++counter;

if (signer.verifyCurrent().bad()) // verify signature corrupt_counter++; } }

signer.detach();

sigItem = DcmSignature::findNextSignatureItem(*dataset, stack); }

if (counter == 0)

cerr << \else

cerr << counter << \ << corrupt_counter << \}

--给一个DICOM文件增加签名。 DcmFileFormat fileformat;

if (fileformat.loadFile(\{

DcmDataset *dataset = fileformat.getDataset();

SiCreatorProfile profile; // select the \

SiRIPEMD160 mac; // use RIPEMD160 as MAC algorithm DcmSignature signer; // signature handler SiCertificate cert; // our certificate

if (cert.loadCertificate(\{

cerr << \ return; }

SiPrivateKey key; // private key, must be unencrypted here

if (key.loadPrivateKey(\{

cerr << \ return; }

signer.attach(dataset); // connect handler to data set

if (signer.createSignature(key, cert, mac, profile).good()) {

fileformat.saveFile(\} }

十、dcmsr程序包

dcmsr是一个结构化报表库和可用工具。这个模块包括一些类来读、写、创建、修改、

访问、打印和显示DICOM结构化报表文档。所支持的SOP类列表由DSRTypes::E_DocumentType提供。

主要接口:

--DSRDocument: Interface class for 'dcmsr' (DICOM Structured Reporting Documents). This class supports reading, writing, creation, printing and rendering of DICOM SR documents (according to DICOM PS 3.x-2004, formerly known as Supplement 23). The list of supported SOP classes is available in file \在dsrdoc.h中定义。

--DSRDocumentTree: 管理SR文档树的类。在dsrdoctr.h中定义。

--DSRContentItem: Interface class for content items. This class allows to access the document tree nodes without using any pointers. 在dsrcitem.h中定义。

--DSRCodedEntryValue: Class for coded entry values. 在dsrcodvl.h中定义。 工具:

dsr2html: Render DICOM SR file and data set to HTML dsr2xml: Convert DICOM SR file and data set to XML dsrdump: Dump DICOM SR file and data set

xml2dsr: Convert DICOM SR file and data set to XML 举例:

--载入一个DICOM结构化报表,并以HTML格式显示其内容。 DcmFileFormat fileformat;

OFCondition status = fileformat.loadFile(\if (status.good()) {

DSRDocument document;

status = document.read(*fileformat.getDataset()); if (status.good()) {

status = document.renderHTML(cout); if (status.bad())

cerr << \} else

cerr << \} else

cerr << \--创建一个DICOM结构化报告,并将其存为文件。 DSRDocument document;

document.setPatientsName(\/* ... */

document.getTree().addContentItem(DSRTypes::RT_isRoot, DSRTypes::VT_Container); document.getTree().getCurrentContentItem().setConceptName(DSRCodedEntryValue(/* some code */));

document.getTree().addContentItem(DSRTypes::RT_hasObsContext, DSRTypes::VT_Code, DSRTypes::AM_belowCurrent);

/* ... */

DcmFileFormat fileformat;

OFCondition status = document.write(*fileformat.getDataset()) if (status.good()) {

status = fileformat.saveFile(\if (status.bad())

cerr << \} else

cerr << \--读取文档树的属性,并直接修改。

DSRDocument document(DSRTypes::DT_KeyObjectDoc); /* ... */

document.getTree().addContentItem(DSRTypes::RT_isRoot, DSRTypes::VT_Container); DSRCodedEntryValue *codePtr = document.getTree().getCurrentContentItem().getConceptNamePtr();

if (codePtr != NULL)

codePtr->setCode(\/* ... */

document.getTree().addContentItem(DSRTypes::RT_contains, DSRTypes::VT_Image); DSRImageReferenceValue *imagePtr = document.getTree().getCurrentContentItem().getImageReferencePtr();

if (imagePtr != NULL) {

imagePtr->setValue(DSRImageReferenceValue(UID_UltrasoundMultiframeImageStorage, /* image UID */));

imagePtr->setPresentationState(DSRCompositeReferenceValue(UID_GrayscaleSoftcopyPresentationStateStorage, /* GSPS UID */));

imagePtr->getFrameList().addItem(2); imagePtr->getFrameList().addItem(5); }

/* ... */

十一、dcmtls程序包

dcmtls是网络库的安全扩展。This module contains classes that implement DICOM network communication tunneled through a Transport Layer Security (TLS) connection, conforming to the DICOM \Enhancements One\extension (formerly Supplement 31). This module requires the external OpenSSL library.

主要接口:

--DcmTLSTransportLayer: factory class which creates secure TLS transport layer connections and maintains the parameters common to all TLS transport connections in one application (e.g. the pool of trusted certificates, the key and certificate to be used for authentication and the list of ciphersuite to be used for association negotiation.)。在tlslayer.h文件中定义。

--DcmTLSConnection: this class represents a TLS (Transport Layer Security) V1 based secure transport connection.

举例:

联系客服:779662525#qq.com(#替换为@)