2012-04-18 1 views
3

Я пытаюсь использовать IM4J (оболочка Java для ImageMagick) для создания миниатюр JPEG-файлов, и это мой первый опыт (когда-либо) с обеими библиотеками. Пожалуйста, обратите внимание, что это сложное требование, которое мне передало мое техническое руководство (так что, пожалуйста, не предлагайте использовать что-либо другое, кроме IM4J/ImageMagick) - мои руки связаны с выбором технологии здесь!ImageMagick/IM4J FileNotFoundException

Я получаю 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-проекта, я должен быть уверен, что IM4J JAR (im4java-1.2.0.jar) находится на пути к классам во время выполнения. Хотя я должен использовать версию IM4J 1.2.0, я имею право использовать любую версию ImageMagick, которую я хочу. Я просто выбрал эту версию, потому что она показалась самой современной/стабильной версией для моей Windows 7 (32-разрядной) машины. Если мне нужно использовать другую версию, пришлите мне ссылку на нее со страницы загрузки ImageMagick в своем ответе!

Что касается ImageMagick, я только что скачал, что EXE из here и поместил его в папку, упомянутой выше - я не делал каких-либо установки, мастера, 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); 
    } 
} 

раздел моего файла appConfig.xml, который содержит imPath:

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

Обратите внимание: если этот файл appConfig.xml не является корректным, наш валидатор схемы поймает его. Поскольку мы не получаем ошибки проверки схемы, мы можем исключить это из-за преступника. Однако, обратите внимание на разделители пути к файлу; они все косые черты. Я сделал это, потому что мне сказали, что в системах Windows косая черта рассматривается так же, как обратная косая черта * nix, в отношении путей к файлам. Верьте или нет, мы разрабатываем машины Windows , но развертываем их на Linux-серверах, поэтому это было мое решение (опять же, не мой звонок!).

IM4J даже признает, что пользователи Windows могут иногда испытывать проблемы и объясняют, что разработчикам Windows, возможно, придется установить IM4JAVA_TOOLPATH env var, чтобы эта библиотека работала. Я попробовал это предложение, создал новую общесистемную переменную окружения с тем же именем и установил ее значение C:\myApp\imageMagickHome. Все равно никакой разницы. Но обратите внимание, что я использую обратную косую черту. Это связано с тем, что этот env var является локальным для моей машины, тогда как appConfig.xml - это дескриптор конфигурации, который развертывается на серверах Linux.

Из того, что я могу сказать, преступник, вероятно, один (или более) из следующих действий:

  • Я не «установить» в ImageMagick EXE правильно и должен использовать инсталлятор/MSI; или мне нужно добавить некоторые другие переменные среды для самого ImageMagick (не IM4J)
  • Возможно, у меня до сих пор нет правильно настроенного IM4J и нужно добавить дополнительные переменные окружения
  • Может быть Windows/* nix "/" vs . «\» вопрос из моего файла appConfig.xml как упоминалось выше

Я также недоумевает, почему я получаю FileNotFoundException на файл с именем «конвертировать»:

Явы. io.FileNotFoundException: конвертировать

Я предполагаю, что это файл пакета/оболочки, который находится где-то внутри банки IM4J (поскольку единственное, что я загрузил для ImageMagick, был EXE). Однако, если я извлекаю банку IM4J, я вижу только классы внутри нее. Я вижу «сценарий-генератор» классов, поэтому я предполагаю, что они стартуют перед моим вызовом cmd.run(op) и создают файл convert, и, возможно, это то, что мне не хватает (возможно, мне нужно вручную запустить один из этих генераторов, например CmdScriptGenerator перед исполнением мои Thumbnailer методы.. Или, может быть, моя скачать неполна.

в любом случае, я просто не разбирался достаточно либо библиотеки, чтобы знать, с чего начать.

Спасибо за любую помощь в этом.

+0

славный вопрос. +1 –

+0

@PinnyM - Я только что запустил программу установки и установил ImageMagick в каталог 'C:/myApp/imageMagickHome'. Теперь я вижу следующее в своей файловой системе: 'C:/myApp/imageMagickHome/ImageMagick-6.7.6-Q16 /'. Я запустил драйвер и получаю ** те же ** ошибки. Мне нужно изменить настройки env var или appConfig.xml, чтобы включить этот новый (автоматически установленный) каталог? – IAmYourFaja

ответ

1

Сначала запустите программу «ImageMagick-6.7.6-1-Q16-windows-dll.exe», чтобы установить библиотеки imagemagick. Затем убедитесь, что ваш путь к среде i ncludes расположение установленных двоичных файлов ('convert.exe', 'mogrify.exe' и т. д.)

+0

Если вы не возражаете, см. Мой комментарий выше и дайте мне знать, отвечает ли этот ответ на этот второй вопрос, который у меня сейчас есть. И еще раз спасибо за помощь! – IAmYourFaja

+0

спасательный жилет, спасибо, спасибо, ** спасибо **. – IAmYourFaja

+0

Как отмечалось выше, путь к среде (предпочтительно системный путь, но необязательный путь пользователя) должен включать каталог изображений binemagick - для вас это должно быть 'C: \ myApp \ imageMagickHome \ ImageMagick-6.7.6-Q16' – PinnyM

0

Убедитесь, что у вас установлен переменный переменный IM4JAVA_TOOLPATH.

enter image description here