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