簡體   English   中英

從RAW格式轉換后立即讀取JPEG圖像時獲取NullPointerException

[英]Getting NullPointerException at the time of reading a JPEG Image right after converting it from a RAW format

這可能是一個非常簡單的問題,但是由於我對Java沒有太多的經驗,所以請提出這個問題。 谷歌搜索很多,但可以找到任何可以幫助的東西。 使我的問題更小一點:

使用具有以下代碼的EXIF工具將圖像從RAW轉換為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命令執行)需要時間,但我的程序不等待確保文件轉換完成。 因此,通過ImageIO讀取數據/向Image Panel顯示數據時,出現了NullPointerException。

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

我想問一問,我的程序是否有辦法等到EXIFTOOL完全轉換圖像,然后才可以執行下一條語句,以便可以在程序的另一處讀取它?

是的,這很容易做到。 Runtimeexec方法返回Process對象,該對象具有一個waitFor方法。 只需調用它,它將阻塞直到該過程完成為止:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM