基于java将dicom转化为jpg的几种方式

参考1 JAVA代码实现DICOM文件转换JPG

package com.example;import java.awt.image.BufferedImage;
import java.io.File;import javax.imageio.ImageIO;import ij.plugin.DICOM;/*** dicom文件java解析,生成图片* 不过这里不能解析压缩的dicom文件*/
public class ImageDemo {public static void main(String args[]) {
//        create("test1.dcm");    //在本地目录生成test1.dcm.jpg图片文件create2("D:\\dicom\\test3.dcm");   //在电脑dicom文件夹下生成test1.dcm.jpg图片文件}/*** 根据dicom文件生成jpg图片* <p/>* 这里输入的是image文件夹的dicom文件名字,* 运行即可得到一个jpg图片,显示的是dicom里面的图形*/private static void create(String fileName) {try {String projectPath = System.getProperty("user.dir");//Check class DICOMDICOM dicom = new DICOM();String imagePath = projectPath + "\\image\\" + fileName;dicom.run(imagePath);BufferedImage bi = (BufferedImage) dicom.getImage();int width = bi.getWidth();int height = dicom.getHeight();System.out.println("width: " + width + "\n" + "height: " + height);imagePath = projectPath + "\\image\\" + fileName + ".jpg";ImageIO.write(bi, "jpg", new File(imagePath));System.out.println("Hehe,Game over!!!");} catch (Exception e) {System.out.println("错误" + e.getMessage());}}/*** 输入一个dicom文件的绝对路径和名字* 获取一个jpg文件*/private static void create2(String filePath) {try {DICOM dicom = new DICOM();dicom.run(filePath);BufferedImage bi = (BufferedImage) dicom.getImage();int width = bi.getWidth();int height = dicom.getHeight();System.out.println("width: " + width + "\n" + "height: " + height);String imagePath = filePath + ".jpg";ImageIO.write(bi, "jpg", new File(imagePath));System.out.println("Hehe,Game over!!!");} catch (Exception e) {System.out.println("错误" + e.getMessage());}}
}

参考2 使用java实现dcm文件转jpg

由于相关的jar基本直接搞不到,需要自己编译jar。这里提供直接带有jar的项目,免去编译问题,很多时候编译失败。

jar一共需要4个:

dcm4che-core-5.20.0.jar
dcm4che-imageio-5.20.0.jar
dcm4che-image-5.20.0.jar
slf4j-api-1.7.30.jar

如果能拿到这几个jar基本随便百度搜索就能解决了。

只需要一个主文件即可:

package club.kittybunny.tool.dcmfile;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.imageio.plugins.dcm.DicomImageReadParam;import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;import javax.imageio.stream.ImageInputStream;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;public class Dcm2Jpg2 {private final ImageReader imageReader = ImageIO.getImageReadersByFormatName("DICOM").next();private float windowCenter;private float windowWidth;private boolean autoWindowing = true;private int windowIndex;private int voiLutIndex;private boolean preferWindow = true;private Attributes prState;private int overlayActivationMask = 0xffff;private int overlayGrayscaleValue = 0xffff;private int frame = 1;
/*** 通过制定源文件目录和目标文件目录,实现dcm转jpg格式* @param args* @throws Exception*/public static void main(String[] args) throws Exception {//源文件加目录全路径,结尾用/结束,只处理里面dcm格式文件 ,例如"/home/bunny/桌面/src/"String src = "/home/bunny/Downloads/qq-files/1023354682/file_recv/3000566.000000-03192/";//目标路径全路径,将源文件加内所有dcm文件转换为同名jpg文件,使用/结束,;例如 "/home/bunny/桌面/w/dcm/"String out = "/home/bunny/桌面/w/dcm/";if (args.length >= 2) {src = args[0];out = args[1];}File f = new File(src);//读取到所有文件名String[] arr = f.list();for (int i = 0; i < arr.length; i++) {//筛选符合条件的文件处理if (arr[i].endsWith(".dcm")) {InputStream in = new FileInputStream(src + arr[i]);ByteArrayOutputStream byteArrayOutputStream = new Dcm2Jpg2().convert(in, null);FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(out + arr[i].substring(0, arr[i].lastIndexOf("."))+".jpg");fileOutputStream.write(byteArrayOutputStream.toByteArray());} catch (IOException e) {e.printStackTrace();}}}}/*** * 实现单文件的dcm转jpg* @param src  dcm文件流* @param name oss的getFileName* @throws Exception*/public ByteArrayOutputStream convert(InputStream src, String name) throws Exception {Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");ImageReader reader = iter.next();try (ImageInputStream iis = ImageIO.createImageInputStream(src)) {reader.setInput(iis, false);BufferedImage bi = readImage(iis);if (bi == null) {throw new Exception("无法读取到图片");}ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(bi, "jpg", os);return os;} catch (IOException e) {e.printStackTrace();return null;}}private ImageReadParam readParam() {DicomImageReadParam param = (DicomImageReadParam) imageReader.getDefaultReadParam();param.setWindowCenter(windowCenter);param.setWindowWidth(windowWidth);param.setAutoWindowing(autoWindowing);param.setWindowIndex(windowIndex);param.setVOILUTIndex(voiLutIndex);param.setPreferWindow(preferWindow);param.setPresentationState(prState);param.setOverlayActivationMask(overlayActivationMask);param.setOverlayGrayscaleValue(overlayGrayscaleValue);return param;}private BufferedImage readImage(ImageInputStream iis) throws IOException {imageReader.setInput(iis);return imageReader.read(frame - 1, readParam());}
}

附带可执行jar的说明文件:

先将需要转换的dcm文件统一放到一个文件夹内,然后创建转换后文件的文件夹,文件夹全路径不能有空格。
执行命令例如:
java -jar dcm2jpg.jar /home/bunny/Downloads/qq-files/1023354682/file_recv/3000566.000000-03192/ /home/bunny/桌面/w/new/

其中第一个参数是源文件所在目录。
第二个参数是转换后文件艘在目录。
所有目录需要“/”结尾。

上面示例,命令中
"/home/bunny/Downloads/qq-files/1023354682/file_recv/3000566.000000-03192/"是原文件所在目录;
“/home/bunny/桌面/w/new/” 是转换后文件所在目录。

参考3 java解析dcm文件到jpg

1、下载源码编译

下载dcm3che源码
mvn install

2、gradle/maven 引用

compile (‘org.dcm4che.tool:dcm4che-tool-dcm2jpg:5.20.0’){
exclude group: ‘org.slf4j’,module: ‘slf4j-log4j12’
}

3、编写工具类

import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.imageio.plugins.dcm.DicomImageReadParam;import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;/*** dcm转jpg工具** @author zhy*/
@Setter
@Slf4j
public class Dcm2jpgUtil {private final ImageReader imageReader = ImageIO.getImageReadersByFormatName("DICOM").next();private float windowCenter;private float windowWidth;private boolean autoWindowing = true;private int windowIndex;private int voiLutIndex;private boolean preferWindow = true;private Attributes prState;private int overlayActivationMask = 0xffff;private int overlayGrayscaleValue = 0xffff;private int frame = 1;/*** 解析dcm获取图片并上传oss** @param src  dcm文件流* @param name oss的getFileName*/public void convert(InputStream src, String name) {Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");ImageReader reader = iter.next();try (ImageInputStream iis = ImageIO.createImageInputStream(src)) {reader.setInput(iis, false);BufferedImage bi = readImage(iis);if (bi == null) {throw new 自定义异常("无法读取到图片");}ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(bi, "jpg", os);//上传到ossOssUtil.uploadByInputStream(new ByteArrayInputStream(os.toByteArray()), name);} catch (IOException e) {log.error(e.getMessage(), e);}}private ImageReadParam readParam() {DicomImageReadParam param = (DicomImageReadParam) imageReader.getDefaultReadParam();param.setWindowCenter(windowCenter);param.setWindowWidth(windowWidth);param.setAutoWindowing(autoWindowing);param.setWindowIndex(windowIndex);param.setVOILUTIndex(voiLutIndex);param.setPreferWindow(preferWindow);param.setPresentationState(prState);param.setOverlayActivationMask(overlayActivationMask);param.setOverlayGrayscaleValue(overlayGrayscaleValue);return param;}private BufferedImage readImage(ImageInputStream iis) throws IOException {imageReader.setInput(iis);return imageReader.read(frame - 1, readParam());}
}

参考4 java代码使用ImageJ解析dicom文件成图片

Dicom全称是医学数字图像与通讯,这里讲java解析diocm格式文件变成jpg示例。
这里的代码只能解析普通的dicom文件成jpg图片,对于压缩的dicom文件是没有办法解析的!
ImageJ解析代码很简单,但是要导入ImageJ的jar包。
从第一个图片可以看到lib中导入了ij.jar,这就是ImageJ的jar包,下面那个zip是source文件,这样就可以看到ImageJ里面的源码。
下面是调用ImageJ的代码:

import ij.plugin.DICOM;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;/*** dicom文件java解析,生成图片* 不过这里不能解析压缩的dicom文件*/
public class ImageDemo {public static void main(String args[]) {
//        create("test1.dcm");    //在本地目录生成test1.dcm.jpg图片文件create2("D:\\dicom\\test3.dcm");   //在电脑dicom文件夹下生成test1.dcm.jpg图片文件}/*** 根据dicom文件生成jpg图片* <p/>* 这里输入的是image文件夹的dicom文件名字,* 运行即可得到一个jpg图片,显示的是dicom里面的图形*/private static void create(String fileName) {try {String projectPath = System.getProperty("user.dir");//Check class DICOMDICOM dicom = new DICOM();String imagePath = projectPath + "\\image\\" + fileName;dicom.run(imagePath);BufferedImage bi = (BufferedImage) dicom.getImage();int width = bi.getWidth();int height = dicom.getHeight();System.out.println("width: " + width + "\n" + "height: " + height);imagePath = projectPath + "\\image\\" + fileName + ".jpg";ImageIO.write(bi, "jpg", new File(imagePath));System.out.println("Hehe,Game over!!!");} catch (Exception e) {System.out.println("错误" + e.getMessage());}}/*** 输入一个dicom文件的绝对路径和名字* 获取一个jpg文件*/private static void create2(String filePath) {try {DICOM dicom = new DICOM();dicom.run(filePath);BufferedImage bi = (BufferedImage) dicom.getImage();int width = bi.getWidth();int height = dicom.getHeight();System.out.println("width: " + width + "\n" + "height: " + height);String imagePath = filePath + ".jpg";ImageIO.write(bi, "jpg", new File(imagePath));System.out.println("Hehe,Game over!!!");} catch (Exception e) {System.out.println("错误" + e.getMessage());}}
}

参考5 lj.jar

#ImageJ解析dicom文件成jpg图片 Dicom全称是医学数字图像与通讯,这里讲java解析diocm格式文件变成jpg示例。 这里的代码只能解析普通的dicom文件成jpg图片,对于压缩的dicom文件是没有办法解析的!
ImageJ解析代码很简单,但是要导入ImageJ的jar包。 从第一个图片可以看到lib中导入了ij.jar,这就是ImageJ的jar包,下面那个zip是source文件,这样就可以看到ImageJ里面的源码。

下面是调用ImageJ的代码:

import ij.plugin.DICOM;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;/*** dicom文件java解析,生成图片* 不过这里不能解析压缩的dicom文件*/
public class ImageDemo {public static void main(String args[]) {
//        create("test1.dcm");    //在本地目录生成test1.dcm.jpg图片文件create2("D:\\dicom\\test3.dcm");   //在电脑dicom文件夹下生成test1.dcm.jpg图片文件}/*** 根据dicom文件生成jpg图片* <p/>* 这里输入的是image文件夹的dicom文件名字,* 运行即可得到一个jpg图片,显示的是dicom里面的图形*/private static void create(String fileName) {try {String projectPath = System.getProperty("user.dir");//Check class DICOMDICOM dicom = new DICOM();String imagePath = projectPath + "\\image\\" + fileName;dicom.run(imagePath);BufferedImage bi = (BufferedImage) dicom.getImage();int width = bi.getWidth();int height = dicom.getHeight();System.out.println("width: " + width + "\n" + "height: " + height);imagePath = projectPath + "\\image\\" + fileName + ".jpg";ImageIO.write(bi, "jpg", new File(imagePath));System.out.println("Hehe,Game over!!!");} catch (Exception e) {System.out.println("错误" + e.getMessage());}}/*** 输入一个dicom文件的绝对路径和名字* 获取一个jpg文件*/private static void create2(String filePath) {try {DICOM dicom = new DICOM();dicom.run(filePath);BufferedImage bi = (BufferedImage) dicom.getImage();int width = bi.getWidth();int height = dicom.getHeight();System.out.println("width: " + width + "\n" + "height: " + height);String imagePath = filePath + ".jpg";ImageIO.write(bi, "jpg", new File(imagePath));System.out.println("Hehe,Game over!!!");} catch (Exception e) {System.out.println("错误" + e.getMessage());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3学习笔记(n.0)

vue指令之v-for 首先创建自定义组件&#xff08;practice5.vue&#xff09;&#xff1a; <!--* Author: RealRoad1083425287qq.com* Date: 2024-07-05 21:28:45* LastEditors: Mei* LastEditTime: 2024-07-05 21:35:40* FilePath: \Fighting\new_project_0705\my-vue-app\…

重载一元运算符

自增运算符 #include<iostream> using namespace std; class CGirl { public:string name;int ranking;CGirl() { name "zhongge"; ranking 5; }void show() const{ cout << "name : "<<name << " , ranking : " <…

cmake编译源码教程(一)

1、介绍 本次博客介绍使用cmake编译平面点云分割的源代码,其对室内点云以及TLS点云中平面结构进行分割,分割效果如下: 2、编译过程 2.1 源代码下载 首先,下载源代码,如下所示,在该文件夹下新建一个build文件夹,用于后续生成sln工程。 同时,由于该库依赖open…

自动化设备上位机设计 二

目录 一 设计原型 二 后台代码 一 设计原型 二 后台代码 namespace 自动化上位机设计 {public partial class Form1 : Form{public Form1(){InitializeComponent();timer1.Enabled true;timer1.Tick Timer1_Tick;}private void Timer1_Tick(object? sender, EventArgs e)…

您的私人办公室!-----ONLYOFFICE8.1版本的桌面编辑器测评

随时随地创建并编辑文档&#xff0c;还可就其进行协作 ONLYOFFICE 文档是一款强大的在线编辑器&#xff0c;为您使用的平台提供文本文档、电子表格、演示文稿、表单和 PDF 编辑工具。 网页地址链接&#xff1a; https://www.onlyoffice.com/zh/office-suite.aspxhttps://www…

AJAX-day1:

注&#xff1a;文件布局&#xff1a; 一、AJAX的概念&#xff1a; AJAX是浏览器与服务器进行数据通信的技术 >把数据变活 二、AJAX的使用&#xff1a; 使用axios库&#xff0c;与服务器进行数据通信 基于XMLHttpRequest封装&#xff0c;代码简单 Vue,React项目使用 学习…

自定义控件绘图篇(一)基本几何图形绘制

在Android开发中&#xff0c;自定义控件是一种强大的技术&#xff0c;它允许开发者创建具有独特外观和行为的UI组件。通过自定义控件&#xff0c;你可以实现标准组件库中没有的功能和设计。自定义控件通常涉及两个主要方面&#xff1a;布局和绘图。本回答将重点介绍如何在自定义…

哪个品牌的加密软件稳定方便使用?

一、什么是企业加密软件&#xff1f; 企业加密软件是一种用于保护企业内部数据安全的工具。在数字化时代&#xff0c;随着数据量的爆炸式增长&#xff0c;信息安全和隐私保护变得愈发重要。企业加密软件作为保障数据安全的关键工具&#xff0c;受到越来越多用户的青睐。 企业…

昆虫学(书籍学习资料)

包括昆虫分类&#xff08;上下册&#xff09;、昆虫生态大图鉴等书籍资料。

调和均值

文章目录 调和均值的定义和公式调和均值的几何解释调和均值的应用调和均值与算术平均和几何平均的比较示例 调和均值的定义和公式 调和均值是一种特殊的平均数&#xff0c;适用于处理涉及比率或速度的数据。对于一组正数 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1​,x2…

Java中的AQS

Java中的AbstractQueuedSynchronizer&#xff08;AQS&#xff09;是Java并发框架的核心组件之一&#xff0c;它位于java.util.concurrent.locks包下。AQS为Java的锁和其他同步工具提供了基础架构&#xff0c;它使用模板设计模式和一种称为“CLH锁”的算法来实现高效的线程同步。…

如何使用 SwiftUI 构建 visionOS 应用

文章目录 前言WindowsVolumes沉浸式空间结论 前言 Apple Vision Pro 即将推出&#xff0c;现在是看看 SwiftUI API 的完美时机&#xff0c;这使我们能够将我们的应用程序适应 visionOS 提供的沉浸式世界。苹果表示&#xff0c;构建应用程序的最佳方式是使用 Swift 和 SwiftUI。…

2024年软件测试岗必问的100+个面试题【含答案】

一、基础理论 1、开场介绍 介绍要领&#xff1a;个人基本信息、工作经历、之前所做过的工作及个人专长或者技能优势。扬长避短&#xff0c;一定要口语化&#xff0c;语速适中。沟通好的就多说几句&#xff0c;沟通不好的话就尽量少说两句。举例如下&#xff1a; 面试官你好&…

Java中Predicate(谓词),方法引用,以及正则的一些讲解

1.Predicate接口简述 FunctionalInterface public interface Predicate<T> {boolean test(T t);default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) && other.test(t);}default Pred…

速盾:cdn加速效果

CDN&#xff08;Content Delivery Network&#xff09;即内容分发网络&#xff0c;是一种通过在全球多个节点服务器上缓存网站的静态资源&#xff0c;并将用户请求导向离用户最近的服务器节点&#xff0c;从而提供更快速的访问体验的技术。 在传统的网络架构中&#xff0c;用户…

鸿蒙 HarmonyOs 网络请求 快速入门

官方文档&#xff1a; ArkUI简介-ArkUI&#xff08;方舟UI框架&#xff09;-应用框架 | 华为开发者联盟 (huawei.com) 一、通过原有的http组件进行网络请求&#xff08;方式一&#xff09; 1.1 HttpRequestOptions的操作 名称类型描述methodRequestMethod请求方式&#xff…

12款超良心好用APP推荐,每一款都值得下载!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/分享是奉献的果实&#xff0c;分享是快乐的前提。每天给小伙伴们分享自己认可的软件&#xff0c;也是莫大的幸福&#xff0c;今天获得12款好用的软…

class类和style内联样式的绑定

这里的绑定其实就是v-bind的绑定&#xff0c;如代码所示&#xff0c;div后面的引号就是v-bind绑定&#xff0c;然后大括号将整个对象括起来&#xff0c;对象内先是属性&#xff0c;属性后接的是变量&#xff0c;这个变量是定义在script中的&#xff0c;后通过这个变量&#xff…

flutter:监听路由的变化

问题 当从路由B页面返回路由A页面后&#xff0c;A页面需要进行数据刷新。因此需要监听路由变化 解决 使用RouteObserver进行录音监听 创建全局变量&#xff0c;不在任何类中 final RouteObserver<PageRoute> routeObserver RouteObserver<PageRoute>();在mai…

flask-apscheduler 定时任务被执行两次

定时任务没有被多次调用&#xff0c;事实上如果多次调用的话&#xff0c;flask-apscheduler会抛出异常。 但一开始任务还是按时执行一次&#xff0c;重启flask或者修改部分代码后&#xff0c;就发送定时任务一次执行两次了。 之所以会发生这种情况&#xff0c;是因为在debug模…