现代医疗保健应用越来越依赖于基于网络的界面,以查看和管理医学图像数据. 将 DICOM 文件转换为 JSON 可与 JavaScript 框架、 REST APIs 和云平台无缝集成。
為什麼要將 DICOM 轉換為 JSON?
DICOM(Digital Imaging and Communications in Medicine)是医学图像的标准格式,但其二进制结构使其在网页应用中工作具有挑战性。
- JavaScript兼容性:JSON是基于网页浏览器和前端框架,如React、Vue 和 Angular。
- REST API 集成: JSON 是现代 Web APIs 的实际标准
- ** 数据库存储**:像 MongoDB 这样的 NoSQL 資料庫以 JSON 文档為本
- 人文可读性:JSON与二进制DICOM相比易于检查和排泄
DICOM PS3.18 标准定义了 JSON 数据的代表性,确保医疗保健系统之间的互动性。
设置您的 .NET 项目
首先,安装 Aspose.Medical for .NET 并设置测量许可:
using Aspose.Medical;
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
// Activate metered license
Metered metered = new Metered();
metered.SetMeteredKey("your-public-key", "your-private-key");
基本 DICOM 到 JSON 转换
将 DICOM 文件转换为 JSON 的最简单方法:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
public class DicomJsonConverter
{
public string ConvertToJson(string dicomFilePath)
{
// Load the DICOM file
DicomFile dicomFile = DicomFile.Open(dicomFilePath);
// Serialize dataset to JSON string
string json = DicomJsonSerializer.Serialize(dicomFile.Dataset);
return json;
}
}
Pretty-Print JSON 用于Debugging
在开发过程中,格式化的JSON更容易阅读和拆卸:
public string ConvertToFormattedJson(string dicomFilePath)
{
DicomFile dicomFile = DicomFile.Open(dicomFilePath);
// Configure serialization options
var options = new DicomJsonSerializerOptions
{
WriteIndented = true // Enable pretty-print
};
string json = DicomJsonSerializer.Serialize(dicomFile.Dataset, options);
return json;
}
使用标签关键字而不是 Hex 代码
默认情况下,DICOM JSON 使用 hexadecimal 标签代码. 为更可读的输出,使用关键字名称:
public string ConvertWithKeywords(string dicomFilePath)
{
DicomFile dicomFile = DicomFile.Open(dicomFilePath);
var options = new DicomJsonSerializerOptions
{
WriteIndented = true,
UseKeywordsAsJsonKeys = true, // Use "PatientName" instead of "00100010"
WriteKeyword = true, // Include keyword in output
WriteName = true // Include human-readable name
};
string json = DicomJsonSerializer.Serialize(dicomFile.Dataset, options);
return json;
}
创建 REST API 终点
下面是如何创建一个 ASP.NET Core 终点,将上传的 DICOM 文件转换为 JSON:
using Microsoft.AspNetCore.Mvc;
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;
[ApiController]
[Route("api/[controller]")]
public class DicomController : ControllerBase
{
[HttpPost("to-json")]
public async Task<IActionResult> ConvertToJson(IFormFile file)
{
if (file == null || file.Length == 0)
{
return BadRequest("No DICOM file provided");
}
try
{
// Save uploaded file temporarily
var tempPath = Path.GetTempFileName();
using (var stream = new FileStream(tempPath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
// Convert to JSON
DicomFile dicomFile = DicomFile.Open(tempPath);
var options = new DicomJsonSerializerOptions
{
WriteIndented = true,
UseKeywordsAsJsonKeys = true
};
string json = DicomJsonSerializer.Serialize(dicomFile.Dataset, options);
// Clean up temp file
System.IO.File.Delete(tempPath);
return Content(json, "application/json");
}
catch (Exception ex)
{
return StatusCode(500, $"Conversion failed: {ex.Message}");
}
}
[HttpGet("metadata/{fileName}")]
public IActionResult GetMetadata(string fileName)
{
var filePath = Path.Combine("DicomFiles", fileName);
if (!System.IO.File.Exists(filePath))
{
return NotFound("DICOM file not found");
}
DicomFile dicomFile = DicomFile.Open(filePath);
// Extract specific metadata fields
var metadata = new
{
PatientName = dicomFile.Dataset.GetString(DicomTag.PatientName),
PatientID = dicomFile.Dataset.GetString(DicomTag.PatientID),
StudyDate = dicomFile.Dataset.GetString(DicomTag.StudyDate),
Modality = dicomFile.Dataset.GetString(DicomTag.Modality),
StudyDescription = dicomFile.Dataset.GetString(DicomTag.StudyDescription)
};
return Ok(metadata);
}
}
基于流的大文件序列化
对于大 DICOM 文件,使用基于流的序列化来减少内存使用量:
public async Task ConvertToJsonStreamAsync(string dicomFilePath, string outputPath)
{
DicomFile dicomFile = DicomFile.Open(dicomFilePath);
var options = new DicomJsonSerializerOptions
{
WriteIndented = true
};
using (var fileStream = new FileStream(outputPath, FileMode.Create))
{
await DicomJsonSerializer.SerializeAsync(
fileStream,
dicomFile.Dataset,
options);
}
}
Batch 转换为多文件
处理 DICOM 文件的完整目录:
public class BatchDicomConverter
{
public async Task ConvertDirectoryAsync(string inputDir, string outputDir)
{
Directory.CreateDirectory(outputDir);
var dicomFiles = Directory.GetFiles(inputDir, "*.dcm");
var options = new DicomJsonSerializerOptions
{
WriteIndented = true,
UseKeywordsAsJsonKeys = true
};
foreach (var filePath in dicomFiles)
{
try
{
DicomFile dicomFile = DicomFile.Open(filePath);
string fileName = Path.GetFileNameWithoutExtension(filePath);
string outputPath = Path.Combine(outputDir, $"{fileName}.json");
using (var stream = new FileStream(outputPath, FileMode.Create))
{
await DicomJsonSerializer.SerializeAsync(
stream,
dicomFile.Dataset,
options);
}
Console.WriteLine($"Converted: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"Failed to convert {filePath}: {ex.Message}");
}
}
}
}
与 React Frontend 相结合
一旦您的 API 返回 JSON,在 React 中消耗它是简单的:
// React component to display DICOM metadata
import React, { useState } from 'react';
function DicomViewer() {
const [metadata, setMetadata] = useState(null);
const handleFileUpload = async (event) => {
const file = event.target.files[0];
const formData = new FormData();
formData.append('file', file);
const response = await fetch('/api/dicom/to-json', {
method: 'POST',
body: formData
});
const json = await response.json();
setMetadata(json);
};
return (
<div>
<input type="file" onChange={handleFileUpload} accept=".dcm" />
{metadata && (
<pre>{JSON.stringify(metadata, null, 2)}</pre>
)}
</div>
);
}
最佳实践
当您将 DICOM 转换为 JSON 为 Web 应用程序时,请记住以下提示:
- ** 转换前匿名化**:在通过 Web APIs 披露 DICOM 数据之前,始终删除患者可识别的信息
- 使用同步方法:在网页应用程序中,使用无同期序列化以避免阻止线条
- Cache 转换数据:如果相同的 DICOM 文件经常被要求,则将 JSON 输出存储
- 验证输入文件:检查上传的文件是有效的DICOM之前处理
- ** 仔细处理二进制数据**:大型像素数据应单独处理或从 JSON 响应中排除
结论
将 DICOM 文件转换为 JSON 为现代 Web 开发开启医学图像数据. 使用 Aspose.Medical for .NET,您可以轻松地序列 Dicom 数据集到 PS3.18 兼容的 Json,构建 REST APIs,并与 JavaScript 框架集成。
有关 DICOM JSON 序列化选项的更多信息,请参阅 ASPOSE.医学文档.