Изменение размера изображения с помощью RxJava - PullRequest
0 голосов
/ 14 октября 2019

У меня есть файл изображения в виде строки 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();
    });
}

}

Любые входные данные для оптимизации изменения размера изображения?

...