imgageJ开发【Java】
一.ImageJ簡介
?
ImageJ是一款由NIH(National Institutes of Health,美國國家衛生研究院)發起,可用于Windows,Mac,OSX和Linux等操作系統的圖像處理開元軟件,ImageJ小巧,只有5MB左右,界面簡潔,容易上手。
?
二.ImageJ軟件安裝
1.下載ImageJ軟件
?? 在百度搜ImageJ,進入官網
?
2.點擊Downlaod,進入下載界面
???
3.下載后解壓,解壓目錄下的ImageJ.exe文件便可以運行軟件,打開后的軟件界面如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
三. ImageJ的二次開發
1.?????配置java的運行環境
(1)在ORACL官網上下載jdk:
我這里的版本是jdk-6u10-rc2-bin-b32-windows-i586-p-12_set_2008
(2)雙擊此exe文件,進入安裝向導,安裝路徑可以修改,這里就安裝在默認路徑下:C:\Program Files\Java\jdk1.6.0_10目錄下
?
(3)點擊“下一步”,直到完成安裝
(4)安裝完畢后還要進行jdk運行環境配置,首先在系統屬性中打開到如下界面:
?
在系統變量中新建第一個變量名:JAVA_HOME,變量值為前面jdk的安裝路徑,這里是C:\Program Files\Java\jdk1.6.0_10
新建第二個變量名:CLASSPATH,變量值為 .:%JAVA_HOME%\lib,注意符號添加正確,.:不要缺少
添加path變量,注意path變量如果已經有了,不要新建了。在變量值后面添加一個分號;隔開,在后面加入%JAVA_HOME%\lib,不然他會覆蓋之前的值
(5)到此jdk環境配置結束
?
?
2.?????java的開發工具Eclipse的使用
(1)在官網上下載開發工具Eclipse,這里用的版本是eclipse-sdk-3.3-win32
(2)下載好后直接運行,出現默認工作空間路徑選擇,可以手動改變路徑,設置后生成的項目都會保存在此目錄下,本文的路徑為D:\java3
(3)配置好后出現此界面
?
?
3.?????驗證實驗小程序(驗證前面的JDK和Eclipse已經安裝配置好)
(1)選擇菜單File下New選項,選擇java projec,打開如下對話框
輸入工程名,例如test1,輸入完畢點擊下一步直至完成
(2)??右擊剛才新建的工程,創建一個包
輸入包名,例如com.test1
(3)??右擊com.test1,在彈跳出的選項中新建類
輸入類名,例如shiyan1
(4)??類名新建好后,會出現帶有頭文件的java程序
?
(5)??編輯程序如下:
?
(6)??如果程序能正常運行,則在console窗口中會顯示如下果:
4. ? ??調用imagej源程序包中的圖像處理函數
(1)??在imagej官網上下載imageJ源碼包,這里我用的版本是ij148r-src
(2)??按照上述方法新建一個工程project1
(3)??打開ij148r-src的子文件夾source,里面包含的文件如下圖:
?
(4)??打開工程project1文件夾,里面包含的文件如下:
?
(5)??將source中的plugins,macros,images文件夾和IJ_Props.txt文件拷貝到project1文件夾中,再把source中的ij文件夾拷貝到project1的子文件夾src中
(6)??右擊eclipse中project1工程,在彈跳窗口中選擇”Refresh”選項進行刷新,便能在src中看到imagej源碼包
?
?
(7)??再按照上述方法新建一個包com.project1和類inverse
(8)??為了驗證imagej源碼包按上述操作后,可以成功調用,編輯一份java程序,此程序中調用了imagej的源碼函數,實現了圖像的打開,顯示,以及反轉操作
運行結果如下:
?
源碼如下:
package com.project1; import ij.process.ImageProcessor; import ij.io.OpenDialog; import ij.ImagePlus; public class inverse { public static void main(String args[]) { OpenDialog wo=new OpenDialog(""); System.out.println("你打開的圖像的路徑是:"); String we=wo.getPath(); System.out.println(we); //--------圖像顯示 ImagePlus ming=new ImagePlus(we); ming.setTitle("原圖像"); ming.show();ImageProcessor ip1=ming.getProcessor(); ImageProcessor ip2=ip1.duplicate(); ip2.invert(); ImagePlus ming2=new ImagePlus("平滑后的圖像",ip2);//圖像有標題 ming2.show();} }這樣你就能夠使用ImageJ中的圖像處理函數了!深入的東西還要讀者自己去挖掘!
?
?ImageJ的源碼函數眾多,可以在imagej官網上查找每個類所包含的成員函數和成員變量:
注意
安裝插件
在ImageJ的安裝包里,有一個”plugins”的文件夾,ImageJ中所有的插件都是放在”plugins”文件夾中。”plugins”文件夾中允許創建與某個插件有關的子文件夾,此文件夾中存放的是與此插件相關的編譯好的類文件以及配置文件。ImageJ的插件機制可以自行識別滿足以下要求的插件
1)插件類按著規定必須繼承以下三個類中的某一個 “PlugIn”,此類在運行時不需要輸入圖像,”PlugInFilter”,此類在運行時需要輸入圖像,以及”PlugInFrame”。
2)插件類的命名中必須至少有一個下劃線。
3)插件類中不允許有包申明,它必須放在默認的包中。
4)編寫好插件后,編譯得到class文件,再按照相關要求寫此插件的”plugins.config”文件,將所有class文件和config文件打包后放在ImageJ的plugin文件夾中即可。
重新運行ImageJ就能在Plugin中找到自己編寫的插件。
開發環境
開發所使用的環境必須和ImageJ的環境對應,若用eclipse開發,ImageJ是x64則,eclipse必須是先x64,編譯的class文件所對應的jdk應該與ImageJ的jdk對應
插件類編寫
插件類若繼承” PlugInFilter” 在插件類的構造函數中,若要傳遞參數需要寫配置文件中寫明,其setup函數需要返回輸入圖像的類型,否則在ImageJ中運行會出現”requires an image of type”,按照圖像處理的需求指定相應的類型。
Java package
?
一些人用了一陣子的Java,可是對于 Java 的 package 跟 import 還是不太了解。很多人以為原始碼 .java 文件中的 import 會讓編譯器把所 import 的程序通通寫到編譯好的 .class 檔案中,或是認為 import 跟 C/C++ 的 #include 相似,實際上,這是錯誤的觀念。
??讓我們先了解一下,Java 的 package 到底有何用處。
??其實,package 名稱就像是我們的姓,而 class 名稱就像是我們的名字。package 名稱有很多 . 的,就好像是復姓。比如說 java.lang.String,就是復姓 java.lang,名字為 String 的類別;java.io.InputStream 則是復姓java.io,名字為 InputStream 的類別。
??Java 會使用 package 這種機制的原因也非常明顯,就像我們取姓名一樣,光是一間學校的同一屆同學中,就有可能會出現不少同名的同學,如果不取姓的話,那學校在處理學生數據,或是同學彼此之間的稱呼,就會發生很大的困擾。相同的,全世界的 Java 類別數量,恐怕比臺灣人口還多,而且還不斷的在成長當中,如果類別不使用套件名稱,那在用到相同名稱的不同類別時,就會產生極大的困擾。幸運的是,Java 的套件名稱我們可以自己取,不像人的姓沒有太大的選擇 ( 所以有很多同名同姓的 ),如果依照 Sun 的規范來取套件名稱,那理論上不同人所取的套件名稱不會相同 ( 請參閱 "命名慣例"的相關文章 ),也就不會發生名稱沖突的情況。
??可是問題來了,因為很多套件的名稱非常的長,在寫程序時,會多打好多字,花費不少時間,比如說在A.B.C文件下有Point和Circle兩個類,現在在程序中要調用:
?????A.B.C.Point??P1=new A.B.C.Point();
?????A.B.C.Circle??C1=new A.B.C.Circle();
實在是不美觀又麻煩.于是,Sun 想了一個辦法,就是 import. 就是在程序一開頭的時候,說明程序中會用到那些類的路徑.首先,在檔案開頭寫:
?????import A.B.C.Point;
?????import A.B.C.Circle;
這兩行說明了類的路徑,所以當程序中提到Point就是指A.B.C.Point,而Circle就是指A.B.C.Circle,依此類推。于是原來的程序就變成:
?????Point??P1=new Point();
?????Circle??C1=new Circle();
這樣看起來是不是清爽多了呢?如果這些類別用的次數很多,那就更能體會到import 的好處了。可是這樣還是不夠,因為懶是人的天性,還是會有人覺得打太多 import 了也很浪費時間,于是 Sun 又提供了一個方法:
????import A.B.C.*; 意思就是,等一下程序中提到的沒有姓名的類別,全都包含在A.B.C這個目錄中。
??注意點:但我們在程序中經常使用System.out這個類,為什么沒有import System.out呢,因為java.lang 這個套件實在是太常太常太常用到了,幾乎沒有程序不用它的,所以不管你有沒有寫 import java.lang;,編譯器都會自動幫你補上,也就是說編譯器只要看到沒有姓的類別,它就會自動去 java.lang 里面找找看,看這個類別是不是屬于這個套件的。所以我們就不用特別去import java.lang 了。
???為甚么我一開始說 import 跟 #include 不同呢?因為 import 的功能到此為止,它不像 #include 一樣,會將檔案內容載入進來。import 只是請編譯器幫你打字,讓編譯器把沒有姓的類別加上姓,并不會把別的文件的程式碼寫進來。如果你想練習打字,可以不要使用 import,只要在用到類別的時候,用它的全部姓名來稱呼它就行了(就像例子一開始那樣),跟使用 import 完全沒有甚么兩樣。
?
?????????????????????????????????先介紹Java的Package機制
基本原則:需要將類文件切實安置到其所歸屬之Package所對應的相對路徑下。
例如:以下面程序為例:假設此Hello.java文件在D:\Java\下
package??A;
public class Hello{
??public static void main(String args[]){???
?????System.out.println("Hello World!");
??}
}
D:\Java>javac??Hello.java??此程序可以編譯通過.接著執行。
D:\Java>java??Hello???????但是執行時,卻提示以下錯誤!
Exception in thread "main" java.lang.NoClassDefFoundError: hello (wrong name: A/Hello)
????????at java.lang.ClassLoader.defineClass0(Native Method)
????????at java.lang.ClassLoader.defineClass(ClassLoader.java:537)
????????at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
????????at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
????????at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
????????at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
????????at java.security.AccessController.doPrivileged(Native Method)
????????at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
????????at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
????????at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
????????at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
????????at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
原因是我們把生成的Hello.class規定打包在D:\Java\A文件中,必須在A文件中才能去運行。所以應該在D:\Java目錄下建立一個A目錄,然后把把Hello.class放在它下面,執行時,可正常通過!
D:\Java\>java A.hello???就會輸出:Hello world!
?
??????????????????????????????現在介紹Java的import機制
我們在D:\Java目錄下建立一個JInTian.java文件,其內容如下:
import??A.Hello;
public class JInTian{
???public static void main(String[] args){
???????Hello??Hello1=new Hello();
?????}
}
D:\Java\>javac JInTian.java???編譯成功!
D:\Java\>java??JInTian??????運行成功!
也就是你在JInTian.class中成功的引用了Hello.class這個類,是通過import A.Hello來實現的,如果你沒有這句話,就會提示不能找到Hello這個類。
提示1:如果你在D:\Java目錄下仍保留一個Hello.java文件的話,執行對主程序的編譯命令時仍會報錯!你自己可以試試呀!
提示2:如果你刪除D:\Java\A\Hello.java文件的話,只留Hello.class文件,執行對主程序的編譯命令時是可以通過,此時可以不需要子程序的源代碼。
提出一個問題:如果把目錄A剪切到其它目錄,如D盤根目錄下,在A目錄如果執行編譯和執行命令呢?
很明顯,會報以下錯誤!當然了,前提條件是你沒有設置classpath路徑,其實只要沒把類搜索路徑設置到我這個位置就會出錯的!你試試吧
imageJ 小例子
Java圖像處理最快技術:ImageJ 學習第一篇 ImageJ是世界上最快的純Java的圖像處理程序。它可以過濾一個2048x2048的圖像在0.1秒內(*)。這是每秒40萬像素!ImageJ的擴展通過使用內置的文本編輯器和Java編譯器的ImageJ的開發插件。500多插件可用。
數據類型:8位灰度或索引色,16位無符號整數,32位浮點和RGB色彩。
文件格式:讀寫所有支持的數據類型為TIFF(非壓縮)或原始數據。打開和保存GIF,JPEG,BMP,PNG,PGM,FITS和ASCII。打開DICOM。使用URL打開的TIFF、GIF文件、JPEG文件、DICOMs和原始數據。也可以擴展許多其他格式 的插件。
圖像增強:支持平滑,銳化,邊緣檢測,中值濾波和閾值的8位灰度和RGB彩色圖像。交互方式調整亮度和8位,16位和32位圖像的對比度。
幾何操作:裁剪,縮放,調整大小和旋轉。翻轉垂直或水平。
分析:測量面積,平均值,標準偏差,最小的選擇和最大或整個圖像。測量長度和角度。使用現實世界中的度量單位,如毫米。校準使用密度標準。生成柱狀圖和剖面圖。
色彩處理:分裂一個32位彩色圖像轉換成RGB或HSV分量。合并8位組件成彩色圖像。RGB圖像轉換為8位索引顏色。應用偽彩色調色板為灰度圖像。
?
基于ImageJ的項目有、CellProfiler(細胞圖像分析)、idoimaging(醫學影像)、ImageSurfer(3D可視化和分析)、MIPAV(3D成像和可視化)、NITRC(神經影像學工具和資源)等。
下面對ImageJ的編程基礎介紹一下。
一、ImageJ的圖像剖析
ImageJ的 圖像由三個部分組成:
1、ImageProcessor對象實例:持有并提供了訪問像素的方法。
2、Image對象實例:即java.awt.Image畫在屏幕上。
3、ImagePlus對象實例:包括所有的元數據(標題,屬性)、ImageProcessor和Image。
ImageJ的 圖像堆棧由四部分組成:
1、ImageStack對象實例:持有像素陣列的陣列(LUT變化通過臨時實例StackProcessor)
2、Image對象實例:即java.awt.Image畫在屏幕上。
3、ImageProcessor對象實例:提供訪問當前切片像素。
4、ImagePlus對象實例:持有ImageStack、ImageProcessor和Image。
?
使用堆棧時,要謹記以下幾點:
1、ImagePlus的ImageProcessor實例在任何調用setSlice(INT)時都由它的像素替換對象。
2、ImageStack.getProcessor(int)在每次調用時都返回一個新的ImageProcessor,是?一個消耗大的操作。
3、ImagePlus的java.awt.Image中在每次調用setSlice(int)時被更新。
?
當ImagePlus調用updateAndDraw()時重新創建 java.awt.Image對象。如果你想改變被反映當前顯示在屏幕上的圖像,必須修改的像素之后調用updateAndDraw()。
?
二、創建圖像
? ? 1、創建一個圖像(詳細)
int?width?=?400; ?
int?height?=?400; ?
ImageProcessor ip?=?new?ByteProcessor(width, height); ?
String title?=?"My new image"; ?
ImagePlus imp?=?new?ImagePlus(title, ip); ?
imp.show(); ?
?
? ??有幾個ImageProcessor類,每個都有自己專門的構造函數。ByteProcessor,ShortProcessor,FloatProcessor和ColorProcessor。
? ? 2、創建一個圖像(簡單方式)
?
? ??? ??new?ImagePlus("My new image",?new?ByteProcessor(400,?400)).show();?
?
? ? 3、創建任意數量任何類型的
? ??? ???A、一個簡單的8位的400x400像素的灰度圖像
ImagePlus imp?=?IJ.createImage("My new image",?"8-bit black",?400,?400,?1);
imp.show();
// or, without getting back a reference:
IJ.newImage("My new image",?"8-bit black",?400,?400,?1);
B、堆棧的400×400像素的10色圖片
ImagePlus imp?=?IJ.createImage("My new image",?"RGB white",?400,?400,?10); ?
imp.show(); ?
// again, without getting back a reference: ?
IJ.newImage("My new image",?"RGB white",?400,?400,?10);?
三、銷毀圖像
調用flush()將釋放所使用的ImagePlus所有內存資源。
ImagePlus imp?=?... ?
imp.flush(); ?
?
注意:如果你持有一個從ImagePlus.getProcessor()方法獲得ImageProcessor。即ImageProcessor的像素數組指針將被設置為null。你應該改為調用ImageProcessor的duplicate(),或直接通過getPixels()得到它的像素,并把它們存儲在相同的尺寸的新ImageProcessor。
?
同樣,java.awt.Image中獲取自己的flush()方法調用也是如此。
四、打開圖像
? ??所有方法都圍繞著ij.io.Opener類展開。
? ? 1、高層次的方式,從文件或URL
?
ImagePlus imp?=?IJ.openImage("/path/to/image.tif"); ?
imp.show(); ?
??
ImagePlus imp?=?IJ.openImage("http://www.example.org/path/to/image.tif"); ?
imp.show(); ?
??
// Without getting back a pointer, and automatically showing it: ?
IJ.open("/path/to/image.tif"); ?
// Same but from an URL ?
IJ.open("http://www.example.org/path/to/image.tif");?
?
? ? 2、從文件打開
Opener opener?=?new?Opener(); ?
ImagePlus imp?=?opener.openImage("/path/to/image.tif"); ?
imp.show(); ?
? ? 3、從URL打開
Opener opener?=?new?Opener(); ?
ImagePlus imp?=?opener.openImage("http://www.example.org/path/to/image.tif"); ?
imp.show();?
?
以上注意URL 包含http://如何的自動檢測并正確解析。如果需要,可以直接調用:
ImagePlus?imp?=?opener.openURL("http://www.example.org/path/to/image.tif"); ?
?
五、編輯像素
1、運行ImageJ命令方式,這是一個高層次的方法,像素可以通過調用ImageJ的命令編輯圖像:
ImagePlus imp?=?... ?
// Making a binary image ?
IJ.run(imp,?"Convert to Mask",?"");?// "" means no arguments ?
??
// Resizing, opens a copy in a new window (the 'create' command keyword) ?
IJ.run(imp,?"Scale...",?"x=0.5 y=0.5 width=344 height=345 interpolate create title=[Scaled version of "?+imp.getTitle()?+?"]"); ?
??... ?
任何ImageJ命令可能被應用。你可以找出哪些命令來使用,哪些參數通過運行插件,并手動調用的ImageJ打開的圖像上的菜單命令。
2、中級層次編輯方式:ImageProcessor(ROIs/selections)
在圖像上繪制或填充ROI(感興趣區域):
ImagePlus imp?=?... ?
ImageProcessor ip?=?imp.getProcessor(); ?
??
// Assuming 8-bit image ?
??
// fill a rectangular region with 255 (on grayscale this is white color): ?
Roi roi?=?new?Roi(30,?40,?100,?100);?// x, y, width, height of the rectangle ?
ip.setRoi(roi); ?
ip.setValue(255); ?
ip.fill(); ?
??
// fill an oval region with 255 (white color when grayscale LUT): ?
OvalRoi oroi?=?new?OvalRoi(50,?60,?100,?150);?// x, y, width, height of the oval ?
ip.setRoi(oroi); ?
ip.setValue(255); ?
ip.fill(ip.getMask());?// notice different fill method ?
? ? ? ? ? ? ? ? ? ? ? ?// regular fill() would fill the entire bounding box rectangle of the OvalRoi ?
// The method above is valid at least for PolygonRoi and ShapeRoi as well. ?
??
??
// draw the contour of any region with 255 pixel intensity ?
Roi roi?=?... ?
ip.setValue(255); ?
ip.draw(); ?
??
// update screen view of the image ?
imp.updateAndDraw(); ?
?
3、ROIs的一些事情:
A、有很多selection/ROI類型:Roi(矩形之一,也是所有其它類型的父類),Line, OvalRoi, PolygonRoi, PointRoi, FreehandRoi, ShapeRoi, TextRoi。另外有一些子類型,如PolygonRoi里的POLYGON、POLYLINE 類型。
B、大部分的ROI是用于編輯圖像非常有用; 一些用于圖像分析(Line,PointRoi,TextRoi)。
C、最強大的ROI是ShapeRoi:java.awt.geom.GeneralPath支持它,它能夠存儲任意數量的任何形狀的不連續區域的。
D、ip.fill(ip.getMask())方法是最安全的,可在各種場合使用,只需要檢查ImageProcessor的mask通過getMask()返回的不為null。
?
旋轉,翻轉和縮放圖像(或者ROI)
ImagePlus imp?=?... ?
ImageProcessor ip?=?imp.getProcessor(); ?
??
ip.flipHorizontal(); ?
??
ip.flipVertical(); ?
??
ip.rotateLeft(); ?
??
ip.rotateRight(); ?
??
// rotate WITHOUT enlarging the canvas to fit ?
double?angle?=?45; ?
ip.setInterpolate(true);?// bilinear ?
ip.rotate(45); ?
??
// rotate ENLARGING the canvas and filling the new areas with background color ?
double?angle?=?45; ?
IJ.run(imp,?"Arbitrarily...",?"angle="?+?angle?+?" grid=1 interpolate enlarge"); ?
??
// scale WITHOUT modifying the canvas dimensions ?
ip.setInterpolate(true);?// bilinear ?
ip.scale(2.0,?2.0);?// in X and Y ?
??
// scale ENLARGING or SHRINKING the canvas dimensions ?
double?sx?=?2.0; ?
double?sy?=?0.75; ?
int?new_width?=?(int)(ip.getWidth()?*?sx); ?
int?new_height?=?(int)(ip.getHeight()?*?sy); ?
ip.setInterpolate(true);?// bilinear ?
ImageProcesor ip2?=?ip.resize(new_width, new_height);?// of the same type as the original ?
imp.setProcessor(imp.getTitle(), ip2);?// UPDATE the original ImagePlus ?
??
// update screen view of the image ?
imp.updateAndDraw(); ?
ImageProcessor類提供了繪制線條、文字和點等。看看在ImageProcessor的API。
?
4、低層次的編輯方式:像素數組
ImagePlus imp?=?... ?
ImageProcessor ip?=?imp.getProcessor(); ?
??
// Editing the pixel array ?
if?(imp.getType()?==?ImagePlus.GRAY8) { ?
? ??byte[] pixels?=?(byte[])ip.getPixels(); ?
? ??// ... do whatever operations directly on the pixel array ?
} ?
??
// Replacing the pixel array: ONLY if same size ?
if?(imp.getType()?==?ImagePlus.GRAY8) { ?
? ??int?width?=?ip.getWidth(); ?
? ??int?height?=?ip.getHeight(); ?
? ??byte[] new_pixels?=?new?byte[width?*?height]; ?
? ??// set each pixel value to whatever, between -128 and 127 ?
? ??for?(int?y=0; y<height; y++) { ?
? ? ? ??for?(int?x=0; x<width; x++) { ?
? ? ? ? ? ??// Editing pixel at x,y position ?
? ? ? ? ? ? new_pixels[y?*?width?+?x]?=?...; ?
? ? ? ? } ?
? ? } ?
? ??// update ImageProcessor to new array ?
? ? ip.setPixels(new_pixels); ?
} ?
??
// Replacing the pixel array but of different length: for example, to resize 2.5 times in width and height ?
int?new_width?=?(int)(ip.getWidth()?*?2.5); ?
int?new_height?=?(int)(ip.getHeight()?*?2.5); ?
ImageProcessor ip2?=?ip.createProcessor(new_width, new_height);?// of same type ?
imp.setProcessor(imp.getTitle(), ip2); ?
??
if?(imp.getType()?==?ImagePlus.GRAY8) { ?
? ??byte[] pix?=?(byte[])imp.getProcessor().getPixels();?// or ip2.getPixels(); ?
? ??// .. process pixels ... ?
? ??for?(int?y=0; y<height; y++) { ?
? ? ? ??for?(int?x=0; x<width; x++) { ?
? ? ? ? ? ??// Editing pixel at x,y position ?
? ? ? ? ? ? new_pixels[y?*?width?+?x]?=?...; ?
? ? ? ? } ?
? ? } ?
} ?
??
// DON'T forget to update the screen image! ?
imp.updateAndDraw(); ?
如果要顯示的ImagePlus,更新圖像只有必須的,
?
六、保存圖像
1、高層次的方式
ImagePlus imp?=?... ?
IJ.saveAs(imp,?"tif",?"/path/to/image.tif"); ?
??
// or by using the file format extension: ?
IJ.save(imp,?"/path/to/image.tif");
? ??
很多格式都支持。在IJ類里搜索方法"saveAs"
2、通過FileSaver類
ImagePlus imp?=?... ?
new?FileSaver(imp).saveAsTiff("/path/to/image.tif");?
該FileSaver類有更多的選擇:saveAsTiffStack,saveAsJpeg,saveAsPng,saveAsGif ...等。
Writing ImageJ Plugins—A Tutorial
https://imagingbook.com/imagej-tutorial/
Java 圖像處理類庫
https://blog.csdn.net/zlxtk/article/details/54890789
總結
以上是生活随笔為你收集整理的imgageJ开发【Java】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TestLink测试用例:Excel转换
- 下一篇: VS2008工具,两种加入库的方法。