4个版本

0.1.7 2022年5月19日
0.1.6 2022年5月18日
0.1.5 2021年7月3日
0.1.0 2020年7月24日

#283 in 内存管理

每月37次下载

MIT许可证

13MB
247K SLoC

C++ 143K SLoC // 0.2% comments C 70K SLoC // 0.2% comments SWIG 22K SLoC // 0.1% comments XSL 4K SLoC // 0.2% comments Python 3.5K SLoC // 0.4% comments C# 2K SLoC // 0.4% comments Java 1.5K SLoC // 0.3% comments Rust 394 SLoC // 0.1% comments Shell 307 SLoC // 0.4% comments PHP 140 SLoC // 0.5% comments Batch 58 SLoC

一个易于使用的草根DICOM库包装器,旨在转换DICOM文件传输语法和光度解释。

用法

您需要CMake来构建GDCM库

Linux Ubuntu

sudo apt-get install cmake

Windows & MacOS

直接从www.cmake.org/download页面下载CMake。

快速入门

复制此代码,并确保您有一个DICOM文件进行测试(DICOM文件样本)。

use std::io::prelude::*;
use std::fs::File;
use gdcm_conv::{TransferSyntax, PhotometricInterpretation};

// Read input file
let mut ibuffer = Vec::new();
let mut ifile = File::open("test.dcm").unwrap();    
ifile.read_to_end(&mut ibuffer).unwrap();

// Transcode DICOM file
let obuffer = match gdcm_conv::pipeline(
    // Input DICOM file buffer
    ibuffer,
    // Estimated Length
    None,
    // First Transfer Syntax conversion
    TransferSyntax::JPEG2000Lossless,
    // Photometric conversion
    PhotometricInterpretation::None,
    // Second Transfer Syntax conversion
    TransferSyntax::None,
) {
    Ok(t) => t,
    Err(e) => {
        eprintln!("{}", e);
        return;
    }
};

// Create output file and save
let mut ofile = File::create("output.dcm").unwrap();
ofile.write_all(&obuffer).unwrap();

工作原理

gdcm_conv库将DICOM文件的内容作为输入。它重新使用源向量,分配一个估计的大小以避免克隆内存。默认估计长度是输入文件大小的3倍,最坏的情况是从压缩图像(如JPEG2000)到原始图像。建议使用估计计算,以最小化内存分配。

如果分配的大小不足,库将重新分配到正确的大小并再次执行FFI函数。

要估计输出长度,可以使用以下近似值

  • (0028,0100) bits_allocated
  • (0028,0004) photometric_interpretation
  • (0028,0008) number_of_frames
  • (0028,0010) rows
  • (0028,0011) columns
// MAX HEADER SIZE
const MAX_HEADER_SIZE: usize = 5000;

let a = match bits_allocated {
    8 => 1,
    16 => 2,
};

let b = match photometric_interpretation {
    "MONOCHROME1" => 1,
    "MONOCHROME2" => 1,
    _ => 3,
};

let estimad_length = (a * b * rows * columns * number_of_frames) + MAX_HEADER_SIZE;

该库作为一个管道工作,包括一个最初的传输语法转换(PRE-TRANSFER)、光度转换和最终的传输语法转换(POST-TRANSFER)。如果设置为None,则不执行该步骤。通常,您将仅使用第一步和/或第二步。

我这样设置是因为在某些情况下需要两次传输语法的转换,如下面的示例所示

从JPEG基线(过程1)1.2.840.10008.1.2.4.50与YBR_FULL或YBR_FULL_422到JPEG2000无损的转换,您需要更改为显式小端传输语法,然后到RGB光度解释,最后到JPG2000,以避免GDCM颜色解释问题。

依赖项