Я использую AsyncScalr в сервлете, чтобы уменьшить масштаб больших изображений (~ 10-15 мегабайт), процесс фактического изменения размера занимает около 40 мс, что мало. Переполнение происходит от чтения изображения из локального хранилища в качестве BufferedImage. поэтому время в основном похоже:Масштабирование больших изображений с использованием Java и AsyncScalr
прочитайте файл изображения: 1630ms !! Изменение размера изображения: 41 мс Запись изображения: 40 мс
Ниже приведен код, который я использую, есть ли более оптимальный способ сделать это?
final FileImageInputStream fileImageInputStream = new FileImageInputStream(file);
BufferedImage bufferedImage = ImageIO.read(fileImageInputStream);
// resize file
Future<BufferedImage> result = AsyncScalr.resize(bufferedImage, Method.SPEED, width, OP_ANTIALIAS, OP_BRIGHTER);
try {
bufferedImage = result.get();
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}
// Write the image
ImageIO.write(bufferedImage, imageOutput, outputStream);
Быстрый совет, если вы обрабатываете это в сервлете, я полагаю, вы обрабатываете загрузки изображений? Если это так, я сделал что-то подобное на imgscalr.com и вытащил данные двоичного изображения непосредственно из тела запроса и потоковым потоком в процесс декодирования ImageIO через Stream. Это помогает избежать записи файла, а затем его считывания и декодирования. Еще один совет, если это на EC2, и вы используете том EBS, вы можете получить более высокую пропускную способность, используя летучие локальные диски на машине. –