Изменение размера изображения Blob перед сохранением в Play Framework - PullRequest
3 голосов
/ 21 марта 2012

Я занимаюсь разработкой веб-страницы с использованием Java и Play Framework 1.2.4.

У меня есть простая форма с вводом файла, которая позволяет пользователю загружать файл изображения.Иногда изображение слишком велико, и для его отображения требуется много времени, поэтому мне нужно изменить его размер.Как я могу сделать это с помощью play?

Я знаю функцию Images.resize (от, до, w, h), я пытался ее использовать, но она не работает, как я ожидал, вот мой код:

public static void uploadPicture(long product_id, Blob data) throws FileNotFoundException {
   String type = data.type();
   File f = data.getFile();
   Images.resize(f, f, 500, -1);
   data.set(new FileInputStream(f), type);

   Product product = Product.findById(product_id);
   product.photo = data;
   product.save();
}

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Изображения, измененные с помощью стандартных библиотек Java, имеют низкое качество. Я бы использовал ImageMagic с библиотеками Java, такими как im4java . Необходимо установить ImageMagic на сервере.

Например, изменение размера изображения на белом фоне может выглядеть так:

private static void toThumb(File original) {
        // create command
        ConvertCmd cmd = new ConvertCmd();

        // create the operation, add images and operators/options
        IMOperation op = new IMOperation();
        op.addImage(original.getPath());
        op.thumbnail(THUMB_WIDTH, THUMB_WIDTH);
        op.unsharp(0.1);
        op.gravity("center");
        op.background("white");
        op.extent(THUMB_WIDTH, THUMB_WIDTH);
        op.addImage(original.getPath());

        try {
            // execute the operation
            cmd.run(op);
        } catch (IOException ex) {
            Logger.error("ImageMagic - IOException %s", ex);
        } catch (InterruptedException ex) {
            Logger.error("ImageMagic - InterruptedException %s", ex);
        } catch (IM4JavaException ex) {
            Logger.error("ImageMagic - IM4JavaException %s", ex);
        }

    }

Добавьте im4java к вашим зависимостям:

require:
    - play ]1.2,)
    - repositories.thirdparty -> im4java 1.1.0

repositories:

    - im4java:
        type:       http
        artifact:   http://maven.cedarsoft.com/content/repositories/thirdparty/[module]/[module]/[revision]/[module]-[revision].[ext]
        contains:
            - repositories.thirdparty -> *
2 голосов
/ 21 марта 2012

Возможно, вам следует определить другой файл назначения вместо записи поверх исходного файла:

File f = data.getFile();
File newFile = new File("Foo.jpg"); // create random unique filename here
Images.resize(f, newFile, 500, -1);
0 голосов
/ 21 марта 2012

Для преобразования изображений вы можете использовать http://imagemagick.org вместе с библиотекой http://im4java.sourceforge.net/.Используйте что-то вроде этого, но с вашими пользовательскими параметрами:

createThumb(from, to, "-thumbnail", "60x60", "-quality", "100", "-format", "jpg"); 
private void createThumb(File from, File to, String... args) throws ImageConvertException {
            ConvertCmd cmd = new ConvertCmd();
            IMOperation op = new IMOperation();
            op.addImage(from.getAbsolutePath());
            op.addRawArgs(args);
            op.addImage(to.getAbsolutePath());
            try {
                cmd.run(op);
            } catch (Exception e) {
                throw new ImageConvertException(e);
            }
}
...