基于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.pswp.cn/web/40289.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40289.shtml
英文地址,請注明出處:http://en.pswp.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模…