当前位置: 首页 > 编程笔记 >

Java解析DICOM图之如何获得16进制数据详解

鲍建业
2023-03-14
本文向大家介绍Java解析DICOM图之如何获得16进制数据详解,包括了Java解析DICOM图之如何获得16进制数据详解的使用技巧和注意事项,需要的朋友参考一下

前言

在最近的一个项目需要用JAVA来解析DICOM图片,DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用,在实现中遇到一些问题下面做一些记录。

首先找一个*.dcm文件。用编辑器打开可以看到如下界面。我是用的编辑器是UltraEdit

红字标注的是字节码的标注,前面8行代码是文件的头信息一般没用。从第九行开始的四个十六进制数“44,49,43,4D”是很重要的。用ASCll码解释就是DICM。表示这是一个DICOM文件,这四个16进制数如果丢失或损坏,这个DICOM图片就无法打开了。

下面用java来读取这些十六进制数

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class My_DICOM {

 static FileInputStream input;
 static byte[] b;
 public static void main(String[] args) {
  try {
   File file = new File("G:/zzz.dcm");
   input = new FileInputStream(file);
   b = new byte[(int) file.length()];
   input.read(b);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  init();
 }
 public static void init(){
  System.out.println("b.length="+b.length);
  for (int i =0;i<10000;i++) {
    System.out.print(Integer.toHexString(b[i]));  
   if (i%16==15) {
    System.out.println();
   }else{
    System.out.print(", ");
   }
  }
 }
}

(因为文件太大有13万个字节,所以为了展示只循环1万次。读取前一万个字节)

上面的代码很普通就是将文件流读入byte数组中。用Integer.toHexString(b[i])将其转化成十六进制。

问题出现了。

运行后:

对照上面的编辑器打开的十六进制列表红字处本该是a6可是却打印出了ffffffa6。

查找问题

笔算出错字节所在的位置是140。打印system.out.pritln(b[140]);结果是-90。为什么是-90?。

反向推到a6转化为十进制应该是166。

好了这些找到问题了。166+90=256这不是巧合。忽略了一个问题就是byte数组的最大值只有127.所以文件中读到的数组大于127时byte数组的读取就会出错。

解决方法

public static void init(){
  System.out.println("b.length="+b.length);
  for (int i =0;i<10000;i++) {
  if (b[i]<0) {
    int temp=b[i]+256;
    System.out.print(Integer.toHexString(temp));
   }else{
    System.out.print(Integer.toHexString(b[i]));
   }

   if (i%16==15) {
    System.out.println();
   }else{
    System.out.print(", ");
   }
  }
 }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。

 类似资料:
  • 本文向大家介绍Python解析多帧dicom数据详解,包括了Python解析多帧dicom数据详解的使用技巧和注意事项,需要的朋友参考一下 概述 pydicom是一个常用python DICOM parser。但是,没有提供解析多帧图的示例。本文结合相关函数和DICOM知识做一个简单说明。 DICOM多帧数据存储 DICOM标准中关于多帧数据存储的最重要一部分说明是PS3.5 Annex A.4

  • 我得到了一个字节数组,存储了一个已经解构的DICOM文件中的16位像素数据。我现在需要做的是以某种方式将像素数据转换/导出为TIFF文件格式。我使用imageio-tiff-3.3.2.jar插件来处理tiff转换/头数据。但是现在我需要将该图像数据数组打包到原始图像维度的BufferedImage中,以便将其导出到TIFF。但是BufferedImage似乎不支持16位图像。有没有办法解决这个问

  • 我正在使用带有Content-Type: Application/dicom的WADO-RS。成功执行请求后,我得到了一个字节流,其中包含一些头信息和Multipart格式的DICOM数据。如何使用C代码从中解析实际的DICOM数据?

  • 问题内容: 如何使用java进行json数据解析?有哪些方法? 问题答案: 使用org.json 使用GSON

  • 本文向大家介绍python对DICOM图像的读取方法详解,包括了python对DICOM图像的读取方法详解的使用技巧和注意事项,需要的朋友参考一下 DICOM介绍 DICOM3.0图像,由医学影像设备产生标准医学影像图像,DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用。在数以万计的在用医学成像

  • 本文向大家介绍对python3.4 字符串转16进制的实例详解,包括了对python3.4 字符串转16进制的实例详解的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇对python3.4 字符串转16进制的实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。