У меня есть файл изображения в виде строки Base64, максимальный размер которого составляет 3 Мбит / с. Я должен изменить размер изображения до 3 разных размеров - большой, средний и маленький. Кроме того, мне нужно вернуть самое маленькое изображение (в виде строки Base64). Я написал следующий код:
System.setProperty("rx2.computation-priority", Thread.MAX_PRIORITY + "");
String smallImage = Observable.zip(
ImageUtils.resize(imageBase64, 800),
ImageUtils.resize(imageBase64, 400),
ImageUtils.resize(imageBase64, 50),
Triple::of)
.map(Triple::getMiddle)
.subscribeOn(Schedulers.computation())
.blockingFirst();
Это служебный класс изменения размера изображения:
public class ImageUtils {
private ImageUtils() {}
public static Observable<String> resize(String imageAsBase64, int size) {
return Observable.create(subscriber -> {
byte[] bytes = DatatypeConverter.parseBase64Binary(imageAsBase64);
BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(bytes));
BufferedImage resizedImage = Scalr.resize(bufferedImage, Scalr.Method.SPEED, size, Scalr.THRESHOLD_BALANCED_SPEED);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(resizedImage, "png", baos);
subscriber.onNext(Base64.getEncoder().encodeToString(baos.toByteArray()));
subscriber.onComplete();
});
}
}
Любые входные данные для оптимизации изменения размера изображения?