ImageMagick с Граалем
Я хочу использовать ImageMagick в своем приложении Grails. Я использую следующие зависимости в BuildConfig.groovy
compile('jmagick:jmagick:6.6.9')
compile('org.im4java:im4java:1.2.0')
Однако, когда я пытаюсь запустить, я получаю эту ошибку:
org.im4java.core.CommandException: java.io.IOException: Cannot run program
"convert": error=2, No such file or directory.
Как использовать ImageMagick или Jmagick с Grails, не устанавливая его напрямую, я пропускаю некоторые зависимости?
3 ответа
jmagick и im4java используют два разных подхода к использованию ImageMagick. Вкратце, jmagick использует Java INI для доступа к API ImageMagick, а im4java вызывает инструменты ImageMagick. Другими словами, jmagick связывает ImageMagick, а im4java - нет. Как вы, вероятно, знаете, ошибка связана с тем, что ImageMagick либо не установлен, либо отсутствует в среде PATH.
im4java
Два не идут вместе. Например, вы не можете использовать im4java для вызова jmagick, чтобы избежать установки ImageMagick на компьютер, на котором размещено приложение Grails. Для использования im4java вам необходимо установить ImageMagick.
jmagick
Поскольку jmagick частично реализован на C, его может быть проблематично использовать в контейнере сервлета. Это, безусловно, сделает веб-приложение непереносимым. Что может сработать, так это чтобы контейнер Servlet предоставил jmagick, скомпилированный для этой платформы, и исключил jmagick из файла war. Не спрашивайте меня, как это сделать:)
Вы также можете установить imageMagick на свой компьютер и использовать "executeCommand" для выполнения команды оболочки для редактирования изображений, например:
def resizeCommand = "/usr/bin/convert pathTo/myOriginalImage.jpg -resize 1920 -quality 80 pathTo/myNewImage.jpg"
executeCommand(resizeCommand)
Перво-наперво: я предлагаю вам использовать версию imagemagick 1.4.0:). Чтение ошибки кажется, что вы не настроили путь imagemagick. В моем приложении Grails, которое использует код imagemagick, выглядит так:
@Value('${externalTools.imagemagick.path:/usr/local/bin}')
private String imagemagickPath
CreateTemporaryThumbnailsResult call(CreateTemporaryThumbnailsEvent event){
log.debug("IMAGEMAGICK PATH: $imagemagickPath")
String originalFilePath = generateOriginalFilePath(event.fileName, event.fileExtension)
String mediumFilePath = generateMediumFilePath(event.fileName, event.fileExtension)
// create command
ConvertCmd cmd = new ConvertCmd();
cmd.setSearchPath(imagemagickPath)
// create the operation, add images and operators/options
IMOperation op = new IMOperation();
op.addImage(originalFilePath);
op.thumbnail(mediumSizeImage, mediumSizeImage)
op.background("white")
op.gravity("center")
op.extent(mediumSizeImage,mediumSizeImage)
op.addImage(mediumFilePath);
// execute the operation
try {
cmd.run(op);
} catch (IOException e) {
return new CreateTemporaryThumbnailsResult(false)
} catch (InterruptedException e){
return new CreateTemporaryThumbnailsResult(false)
} catch(Exception e){
return new CreateTemporaryThumbnailsResult(false)
}
return new CreateTemporaryThumbnailsResult(true, event.fileName + ImageSize.MEDIUM.toString() + "." + event.fileExtension, event.fileName)
}
Я использовал проект "Хипстероид Граальс" в качестве примера, чтобы узнать, как использовать imagemagick с Граалями. Я предлагаю вам сделать то же самое, если у вас есть какие-либо сомнения, он действительно полон информации о манипулировании изображениями с помощью groovy и imagemagick.