2016-02-29 78 views
0

這可能是一個非常簡單的問題,但是由於我對Java沒有太多的經驗,所以請求它。 Google搜索很多,但可以找到任何可能的幫助。 使我的問題更小,給點意見:在從RAW格式轉換JPEG圖像後立即獲取NullPointerException

從RAW轉換的圖像通過使用EXIF工具,下面的代碼,JPEG:

String[] cmd = { "cmd.exe", "/c", "d:\\exiftool " + file.getPath() + " -previewimage -b > "+ file.getPath().replace("." + ext, ".jpeg") }; 

Runtime.getRuntime().exec(cmd); 

通過使用上面我能RAW轉換爲JPEG和文件正在生成。

的代碼,我訪問了轉換後的JPEG文件,並將其顯示在一個JPanel一些行後通過閱讀它作爲

File file= new File(file.getPath().replace("." + ext, ".jpeg")); // creating file object from converted image path 
BufferedImage img = ImageIO.read(file); 

現在,這裏是問題: 由於很少的RAW文件太大,轉換(由exif命令執行)需要時間,但我的程序不會等待以確保文件轉換已完成。 As,在通過ImageIO讀數據的同時向Image Panel顯示數據時的結果我得到了NullPointerException。

作爲一個臨時修復程序,我在執行我的EXIF工具命令後立即調用Thread.sleep(),並使其每個RAW文件(大小約爲25,198,592字節)的睡眠時間爲200毫秒。通過使用一些HitnTrial方法,通過再次運行我的程序並再次嘗試增加毫秒數來計算這個毫秒。我知道這是讀取轉換後圖像的最糟糕的邏輯,但並不能保證每次和每一個系統都睡這個線程就足以讀取轉換後的圖像文件。

我想問一下,有沒有一種方法可以讓我的程序等到EXIFTOOL完全轉換圖像,然後才能執行下一條語句,以便在程序中的其他位置讀取它?

+1

一個小點,ExifTool不會隱藏圖像文件。在這種情況下,您正在提取嵌入RAW文件中的jpg。 – StarGeek

回答

2

是的,這可以很容易地完成。 Runtime上的exec方法返回Process對象,該對象具有waitFor方法。只需調用它,它會阻止,直到過程完成:

Process proc = Runtime.getRuntime().exec(cmd); 
proc.waitFor(); 

您也可以用它來檢查是否有錯誤。如果過程成功完成,則waitFor將返回0。如果失敗,它將返回一個錯誤代碼。

+0

我沒有「感謝你」的話,你甚至不會想到我是多麼的無助。 非常感謝你:-D –