2012-04-18 17 views
3

我想使用IM4J(ImageMagick的Java包裝器)來創建JPEG的縮略圖,這是我對這兩個庫的第一次體驗(曾經)。請注意,這是我的技術負責人交給我的硬性要求(所以請不要建議使用除IM4J/ImageMagick以外的任何其他解決方案) - 我的雙手與技術選擇緊密相連!ImageMagick/IM4J FileNotFoundException

我得到FileNotFoundExceptionconvert命令,它告訴我沒有這些庫(或兩個)之一正確設置。

在我的電腦上,這裏是我的目錄結構:

C:/ 
    myApp/ 
     images/    --> where all of my JPEGs are 
     thumbnails/   --> where I want ImageMagick to send the converted thumbnails to 
     imageMagickHome/ --> Where I downloaded the DLL to 
      ImageMagick-6.7.6-1-Q16-windows-dll.exe 
    ... 

在我的Java項目,我請確保IM4J JAR(im4java-1.2.0.jar)是在運行時類路徑。儘管我需要使用IM4J的1.2.0版本,但我可以隨意使用我想要的任何版本的ImageMagick。我只是選擇了這個版本,因爲它似乎是我的Windows 7(32位)機器的最新/穩定版本。 如果我應該使用不同的版本,請在您的答案中通過ImageMagick下載頁面向我發送一個鏈接。

至於ImageMagick的,我剛剛下載的EXE從here並把它放在上面提到的文件夾中 - 我沒有做任何安裝,嚮導,微星,環境變量的配置

然後在我的Java代碼:

// In my driver... 
File currentFile = new File("C:/myApp/images/test.jpg"); --> exists and is sitting at this location 
File thumbFile = new File("C:/myApp/thumbnails/test-thumb.jpg"); --> doesnt exist yet! (destination file) 
Thumbnailer myThumbnailer = new Thumbnailer(); 
myThumbnailer.generateThumbnail(currentFile, thumbFile); 

// Then the Thumbnailer: 
public class Thumbnailer 
{ 
    // ... omitted for brevity 

    public void generateThumbnail(File originalFile, File thumbnailFile) 
    { 
     // Reads appConfig.xml from classpath, validates it against a schema, 
     // and reads the contents of an element called <imPath> into this 
     // method's return value. See below 
     String imPath = getIMPathFromAppConfigFile(); 

     org.im4java.core.IMOperation op = new Operation(); 
     op.colorspace(this.colorSpace); 
     op.addImage(originalFile.getAbsolutePath()); 
     op.flatten(); 
     op.addImage(thumbnailFile.getAbsolutePath()); 

     ConvertCmd cmd = new ConvertCmd(); 

     cmd.setSearchPath(imPath); 

     // This next line is what throws the FileNotFoundException 
     cmd.run(op); 
    } 
} 

我appConfig.xml文件中包含的Impath的部分:

<imPath>C:/myApp/imageMagickHome</imPath> 

請注意 - 如果此appConfig.xml格式不正確,我們的模式驗證器將會捕獲它。由於我們沒有獲得模式驗證錯誤,因此我們可以將其排除爲罪魁禍首。 但是,注意我的文件路徑分隔符;他們都是正斜槓。我這樣做是因爲我被告知,在Windows系統中,正斜槓與* nix反斜槓相同,參考文件路徑。信不信由你,我們正在開發Windows 機器,但部署到linux服務器,所以這是我的解決方案(再次,我的電話不是!)。

IM4J甚至承認Windows用戶有時可能會遇到麻煩,並且在this文章中解釋說Windows開發人員可能必須設置一個IM4JAVA_TOOLPATH env var才能使此庫正常工作。我嘗試了這個建議,創建了一個新的系統範圍的同名環境變量,並將其值設置爲C:\myApp\imageMagickHome。仍然沒有區別。 但請注意,我在此使用反斜槓。這是因爲這個env var對我的機器來說是本地的,而appConfig.xml是一個配置描述符,它被部署到linux服務器上。

從我所知道的,罪魁禍首可能是以下中的一個(或多個):

  • 我沒有正確地「安裝」 ImageMagick的EXE和應該使用安裝程序/ MSI;或者我需要爲ImageMagick(而不是IM4J)本身添加一些其他環境變量
  • 也許我還沒有正確配置IM4J並需要添加更多環境變量
  • 可能是Windows/* nix「/」vs 「\」上述

我也困惑,爲什麼我得到一個名爲「轉換」文件FileNotFoundException提到從我appConfig.xml文件問題:

的Java。 io.FileNotFoundException:轉換

我認爲這是一個批處理/ shell文件居住在IM4J罐子裏面(因爲我下載的ImageMagick唯一的東西就是EXE)。但是,如果我提取IM4J jar,我只能看到其中的類。我看到「腳本生成器」類,所以我假設這些在我的cmd.run(op)調用之前啓動並創建convert文件,也許這就是我所缺少的(也許我需要在執行之前手動啓動其中一個生成器,如CmdScriptGeneratorThumbnailer方法。或者,也許我的下載是不完整的。

無論哪種方式,我只是不精通足以與任一庫知道從哪裏開始。

感謝任何幫助。

+0

不錯的問題。 +1 – 2012-04-18 15:59:49

+0

@PinnyM - 我剛剛運行安裝程序並將ImageMagick安裝到該「C:/ myApp/imageMagickHome」目錄中。現在我在我的文件系統上看到以下內容:'C:/ myApp/imageMagickHome/ImageMagick-6.7.6-Q16 /'。我重新運行了驅動程序,並得到**相同的**錯誤。我是否需要更改我的env var或appConfig.xml設置以包含這個新的(自動安裝的)目錄? – IAmYourFaja 2012-04-18 16:06:28

回答

1

首先運行'ImageMagick-6.7.6-1-Q16-windows-dll.exe'安裝程序以安裝imagemagick庫,然後確保您的環境路徑爲i包括安裝的二進制文件的位置('convert.exe','mogrify.exe'等)

+0

如果您不介意,請參閱我上面的評論,並讓我知道這個答案是否解決了我現在擁有的第二個問題。並再次感謝迄今爲止所有的幫助! – IAmYourFaja 2012-04-18 16:07:33

+0

拯救生命,謝謝,謝謝,**謝謝**。 – IAmYourFaja 2012-04-18 16:27:56

+0

如上所述,環境路徑(最好是系統路徑,但可選用戶路徑)需要包含imagemagick二進制文件目錄 - 對於你應該是'C:\ myApp \ imageMagickHome \ ImageMagick-6.7.6-Q16' – PinnyM 2012-04-18 20:15:08

0

確保你已經設置了環境變量IM4JAVA_TOOLPATH。

enter image description here