Какой лучший способ закрасить или нарисовать изображение на Java? - PullRequest
1 голос
/ 15 марта 2010

У меня есть набор изображений, которые я объединяю в одну мозаику изображений, используя JAI MosaicDescriptor .

Большинство изображений имеют одинаковый размер, но некоторые меньше. Я хотел бы заполнить недостающее пространство белым - по умолчанию, MosaicDescriptor использует черный. Я попытался установить параметр фона double [] равным {255}, и он заполняет недостающее пространство белым, но он также привносит некоторое обесцвечивание в некоторых других полноразмерных изображениях.

Я открыт для любого метода - возможно, есть много способов сделать это, но с документацией трудно ориентироваться. Я рассматриваю возможность преобразования любых небольших изображений в BufferedImage и вызова setRGB () в пустых областях (хотя я не уверен, что использовать для сканирования в методе setRGB () пакета).

Мой вопрос по сути:

  • Как лучше всего взять изображение (в JAI или BufferedImage) и заполнить / добавить отступы до определенного размера?
  • Есть ли способ сделать это в вызове MosaicDescriptor без побочных эффектов?

Для справки, вот код, который создает мозаику:

    for (int i = 0; i < images.length; i++) {
        images[i] = JPEGDescriptor.create(new ByteArraySeekableStream(images[i]), null);

        if (i != 0) {
            images[i] = TranslateDescriptor.create(image, (float) (width * i), null, null, null);
        }
    }

    RenderedOp finalImage = MosaicDescriptor.create(ops, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null, null);

1 Ответ

0 голосов
/ 16 марта 2010

Чтобы ответить на часть моего вопроса, это можно сделать с помощью Graphics2D и BufferedImages без использования JAI вообще:

    final BufferedImage montageImage = new BufferedImage(montageSize, montageSize, BufferedImage.TYPE_INT_RGB);

    final Graphics2D g2 = montageImage.createGraphics();
    g2.setPaint(Color.WHITE);
    g2.fillRect(0, 0, montageSize, montageSize);

    for (int i = 0; i < imageData.length; i++) {
        final BufferedImage inputImage = ImageIO.read(new ByteArrayInputStream(imageData[i]));
        g2.drawImage(inputImage, i * size, 0, null);
     }

    g2.dispose();

По сути, изображение создается в желаемом полном размере и заполняется белым. Затем меньшие изображения выводятся в правильных местах.

...