2017-05-04 121 views
2

我使用ImageJ API將一些24位TIFF圖像轉換爲8位JPG。 轉換後,我需要對這些圖像進行其他處理。 我做了這個:ImageJ - 在不保存文件的情況下轉換圖像格式

ImagePlus img = IJ.openImage(f.getAbsolutePath()); // Open image 
new ImageConverter(img).convertToGray8(); // Convert image to 8-bit grayscale 
IJ.saveAs(img, "jpg", newPath); // Export image to jpg 
// Read the same image again 
// Process it 

我的問題是轉換必須將圖像保存到磁盤和我後立即看了一遍,還我處理大量的圖像。 有沒有辦法創建jpg圖像並將其放入對象而不將其存儲在磁盤上?

具體來說,我的目標是創建一個帶有圖像字節內容的Hadoop SequenceFile,所以我根本不需要存儲它們。

回答

1

你可以從ImagePlus類原料緩衝圖像這樣:

BufferedImage rawImage = img.getBufferedImage(); 

所以理論上你可以使用從那裏API上獲得的,而不是在磁盤上寫入的字節

ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
ImageIO.write(rawImage, "jpg", baos); 
byte[] imageInByte=baos.toByteArray(); 

希望,這將工作

+1

您不能在ImageIO.write()中使用Image,因爲它是一個Abstract類,而是像其他答案中的@sorifiend所提示的那樣使用像BufferedImage bufferedImage = img.getBufferedImage()這樣的實現。 順便說一句,這個工程,我所缺少的是,ImageIO可以寫入ByteArrayOutputStream而不是File,非常感謝。 – kennyFF92

+0

謝謝!更新的答案是準確的 –

0

我想你最好的方式就是搶的BufferedImage,而不是將其保存:

使用ImagePlus myImage = IJ.getImage();返回ImagePlus對象,則可以使用myImage.getBufferedImage()返回標準java.awt.image.BufferedImage,現在您可以繼續使用緩衝圖像而無需使用ImagePlus庫。

ImagePlus img = IJ.openImage(f.getAbsolutePath()); // Open image 
new ImageConverter(img).convertToGray8(); // Convert image to 8-bit grayscale 
ImagePlus myImage = IJ.getImage(); 
BufferedImage bufferedImage = myImage.getBufferedImage(); 
// Process bufferedImage 

從ImagePlus方法:https://imagej.nih.gov/ij/developer/api/ij/ImagePlus.html

公共java.awt.image.BufferedImage中getBufferedImage()

返回此圖像的副本作爲一個8位或RGB的BufferedImage。

+0

這不是我所需要的,因爲它仍然錯過轉換爲JPG部分,仍然感謝 – kennyFF92

相關問題