Байт-массив для какого-либо изображения Java/Scala. Требования к производительности

98
10

Я пишу FTP-сервер, который получает изображения, а затем изменяет размеры и загружает их.


Мой текущий процесс (псевдокод) выглядит следующим образом:


val imagesAsBytes: Array[Byte] = ...
val bufferedImage: BufferedImage = ImageIO.read(new ByteArrayInputStream(bytes))
uploadImage(bufferedImage)

Это суть этого. Я отказался от изменения размера, потому что это не важно. По сути, я сериализую Array[Byte] в BufferedImage с помощью модуля ImageIO, а затем изменяю его размер.


Я сделал некоторое профилирование, и я заметил, что создание BufferedImage с использованием ImageIO очень медленное.


Если я просто загружаю Array[Byte], я могу достичь около 4x пропускной способности, чем если бы я на самом деле попытался преобразовать его в BufferedImage. Причина, по которой я не могу просто загрузить Array[Byte], заключается в том, что мне нужно изменить размер изображения. Я не привязан к BufferedImage, это только моя первая попытка.


Кто-нибудь знает некоторые идеи, которые я могу использовать, чтобы ускорить это? Есть ли лучший формат, который я должен использовать над BufferedImage?


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


Изменить: я рассмотрел этот вопрос и знаю об этом: ImageIO.setUseCache(false)

спросил(а) 2015-07-23T03:47:00+03:00 5 лет, 2 месяца назад
1
Решение
81

Я бы предложил посмотреть более активно поддерживаемую библиотеку (последняя версия в мае 2016 года), например scrimage. Под капотом используется java.awt.*. По крайней мере, в случае каких-либо проблем вы сможете обратиться к ним и получить их разрешение, более того, используя более "масштабируемый" API.

Надеюсь, что это поможет.

ответил(а) 2016-06-21T06:52:00+03:00 4 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема