Изк, учитывая ваши требования, я бы согласился с Томасом, и вам (вероятно) нужно полагаться на внешнюю / нативную библиотеку.
Если бы вы не упомянули явно производительность, я бы предложил использовать 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.
Есть несколько предложений, которые помогут вам добраться туда, надеюсь, они помогли.