IM4J(ImageMagickのJavaラッパー)を使用してJPEGのサムネイルを作成しようとしていますが、両方のライブラリを使用したのはこれが初めてです。これは私の技術リーダーから渡された厳しい要件であることに注意してください(したがって、IM4J / ImageMagick以外のものを使用することを提案しないでください)-私の手はここでの技術の選択に縛られています!
これらのライブラリのいずれか(または両方)が正しくセットアップされていないことを通知するコマンドを取得してFileNotFoundException
います。convert
私のコンピュータでは、これが私のディレクトリ構造です:
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プロジェクトではim4java-1.2.0.jar
、実行時にIM4J JAR()がクラスパス上にあることを確認します。IM4Jの1.2.0バージョンを使用する必要がありますが、任意のバージョンのImageMagickを自由に使用できます。このバージョンを選択したのは、Windows 7(32ビット)マシンの最新/安定バージョンのようだったからです。別のバージョンを使用する必要がある場合は、回答のImageMagickダウンロードページからそのバージョンへのリンクを送ってください。
ImageMagickに関しては、ここからそのEXEをダウンロードして、上記のフォルダーに配置しました。インストール、ウィザード、MSI、環境変数の構成などは行いませんでした。
次に、私の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);
}
}
imPathを含むappConfig.xmlファイルのセクション:
<imPath>C:/myApp/imageMagickHome</imPath>
注意してください-このappConfig.xmlが整形式でない場合、スキーマバリデーターがそれをキャッチします。スキーマ検証エラーが発生していないため、これを原因として除外できます。ただし、ファイルパスの区切り文字に注意してください。それらはすべてスラッシュです。これを行ったのは、Windowsシステムでは、ファイルパスに関して、スラッシュは*nixバックスラッシュと同じように扱われると言われたためです。信じられないかもしれませんが、私たちはWindowsマシンで開発していますが、Linuxサーバーにデプロイしているので、これが私の解決策でした(これも私の呼びかけではありません!)。
IM4Jは、Windowsユーザーが問題を起こすことがあることを認めており、このIM4JAVA_TOOLPATH
記事では、Windows開発者がこのライブラリを機能させるためにenv変数を設定する必要があるかもしれないと説明しています。この提案を試し、同じ名前の新しいシステム全体の環境変数を作成し、その値をに設定しましたC:\myApp\imageMagickHome
。それでも違いはありません。ただし、ここでバックスラッシュを使用していることに注意してください。これは、このenv varが私のマシンに対してローカルであるのに対し、appConfig.xmlはLinuxサーバーにデプロイされる構成記述子であるためです。
私の知る限り、犯人はおそらく次のうちの1つ(またはそれ以上)です。
- ImageMagick EXEを正しく「インストール」しなかったので、インストーラー/MSIを使用する必要がありました。または、ImageMagick(IM4Jではない)自体に他の環境変数を追加する必要があります
- おそらく、IM4Jがまだ正しく構成されておらず、環境変数を追加する必要があります
- 上記のように、appConfig.xmlファイルからのWindows / *nix"/"と""の問題である可能性があります
FileNotFoundException
また、「convert」という名前のファイルを取得する理由についても困惑しています。
java.io.FileNotFoundException:変換
これはIM4Jjar内のどこかにあるバッチ/シェルファイルだと思います(ImageMagick用にダウンロードしたのはEXEだけだったので)。ただし、IM4J jarを抽出すると、その中のクラスしか表示されません。cmd.run(op)
「スクリプトジェネレーター」クラスが表示されるので、呼び出しの前にこれらのキックオフを想定してファイルを作成します。これが欠けている可能性があります(メソッドを実行する前convert
のように、これらのジェネレーターの1つを手動でキックオフする必要があります。または、ダウンロードが不完全な場合があります。CmdScriptGenerator
Thumbnailer
いずれにせよ、私はどちらのライブラリにも精通していないため、どこから始めればよいかわかりません。
これについて助けてくれてありがとう。