java 1.4 хорошее качество изображения изменить размер - PullRequest
4 голосов
/ 04 августа 2011

У нас есть фотогалерея, в которой используются сервлеты для изменения размера изображений - нам нужна хорошая производительность и достойное качество, но мы просто не можем сделать это правильно.Кроме того, к сожалению, у нас есть только java 1.4, что оставляет нас практически без внешних библиотек изображений (почти все, что я нашел, это java 1.5+), и обработка изображений java действительно не очень хорошая.

Если я использую это:

private static BufferedImage scaleImage(BufferedImage orig, int type, int w, int h) {

    BufferedImage tmp = new BufferedImage(w, h, type);
    Graphics2D g2 = tmp.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

    g2.drawImage(orig, 0, 0, w, h, null);
    g2.dispose();
    return tmp;
}

результаты почти всегда одинаковы (и плохо выглядят) или очень медленные, это зависит от выбранной подсказки.Я прочитал почти каждую статью об изменении размера изображения в Java (в том числе этот , и это не помогает.

У вас есть какие-либо идеи? Какие-нибудь внешние библиотеки для Java 1.4, которые быстрые и имеют достойныйкачество? Любой алгоритм, который будет получать хорошие результаты?

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Вы можете попробовать обертки Image Magick как JMagick .

0 голосов
/ 04 августа 2011

Изк, учитывая ваши требования, я бы согласился с Томасом, и вам (вероятно) нужно полагаться на внешнюю / нативную библиотеку.

Если бы вы не упомянули явно производительность, я бы предложил использовать BICUBIC-интерполяцию вместе с алгоритмом инкрементного масштабирования Криса Кэмпбелла. Библиотека imgscalr реализует все это, но требует Java 5 (использует Enums). При этом вы можете легко скопировать код в реализацию, совместимую с Java 1.4.

Посмотрите на класс Scalr , прокрутите до ОЧЕНЬ дна и скопируйте два последних метода. Это все, что вам нужно, чтобы выполнить 95%, если вы хотите, чтобы это было реализовано в Java.

Но если вы находите производительность масштабирования Java неприемлемой до этого момента, эта реализация вам не поможет. Вам нужно будет использовать нативную библиотеку, например ImageMagick.

К счастью, ImageMagick имеет 2 популярных привязки Java, и если API JMagick не позволяет вам работать с InputStreams, вы можете посмотреть на im4java , который является прямой оболочкой для версии ImageMagick для командной строки. Я копался в исходном коде, и он выглядит как основной класс ImageCommand , используемый для переноса «команд» для отправки в утилиту командной строки, позволяющих передавать экземпляры BufferedImage в качестве параметра объекта «images» при выполнении операции .

В этом случае вы можете использовать ImageIO.read (InputStream) для считывания данных изображения в BufferedImage перед отправкой его в ImageMagick для обработки с использованием API im4java.

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

...