Как я могу накладывать изображения друг на друга в Java? - PullRequest
2 голосов
/ 14 марта 2009

Итак, я публиковал сообщения повсюду и до сих пор не получил четкого ответа:

Я создал класс изменения размера изображения с помощью метода кадрирования. Обрезка работает отлично. У меня проблема с цветом фона, который я определяю в функции drawImage для Graphics, и она работает неправильно. По умолчанию черный цвет используется в качестве фона независимо от того, что я поставляю (в данном случае Color.WHITE).

Кроме того, накладываемое изображение или самое верхнее изображение (полученное из файла) инвертируется (я так думаю) или обесцвечивается иным образом Чтобы вы могли немного лучше осмыслить это, я беру JPEG и накладываю его поверх нового BufferedImage, фон нового буферизованного изображения не устанавливается. Вот код ниже, с которым я работаю:

public void Crop(int Height, int Width, int SourceX, int SourceY) throws Exception {
    //output height and width
    int OutputWidth = this.OutputImage.getWidth();
    int OutputHeight = this.OutputImage.getHeight();

    //create output streams
    ByteArrayOutputStream MyByteArrayOutputStream = new ByteArrayOutputStream();
    MemoryCacheImageOutputStream MyMemoryCacheImageOutputStream = new MemoryCacheImageOutputStream(MyByteArrayOutputStream);

    //Create a new  BufferedImage
    BufferedImage NewImage = new BufferedImage(Width, Height, BufferedImage.TYPE_INT_RGB);
    Graphics MyGraphics = NewImage.createGraphics();

    MyGraphics.drawImage(this.OutputImage, -SourceX, -SourceY, OutputWidth, OutputHeight, Color.WHITE, null);

    // Get Writer and set compression
    Iterator MyIterator = ImageIO.getImageWritersByFormatName("png");
    if (MyIterator.hasNext()) {
        //get image writer
        ImageWriter MyImageWriter = (ImageWriter)MyIterator.next();

        //get params
        ImageWriteParam MyImageWriteParam = MyImageWriter.getDefaultWriteParam();

        //set outputstream
        MyImageWriter.setOutput(MyMemoryCacheImageOutputStream);

        //create new ioimage
        IIOImage MyIIOImage = new IIOImage(NewImage, null, null);

        //write new image
        MyImageWriter.write(null, MyIIOImage, MyImageWriteParam);
    }

    //convert output stream back to inputstream
    ByteArrayInputStream MyByteArrayInputStream = new ByteArrayInputStream(MyByteArrayOutputStream.toByteArray());
    MemoryCacheImageInputStream MyMemoryCacheImageInputStream = new MemoryCacheImageInputStream(MyByteArrayInputStream);

    //resassign as a buffered image
    this.OutputImage = ImageIO.read(MyMemoryCacheImageInputStream);
}

Ответы [ 2 ]

1 голос
/ 15 марта 2009

В случае проблемы с наложением цветов убедитесь, что ваш графический контекст находится в режиме рисования, а не в режиме xor. (Graphics.setPaintMode ()). В противном случае цветовые биты будут XOR вместе.

1 голос
/ 14 марта 2009

Можете ли вы выделить, являются ли методы Graphics или ImageIO искалечением вашего изображения? Похоже, что вы можете проверить это, замкнув весь процесс ImageIO и просто назначив

this.OutputImage = NewImage;

В этом отношении, я полагаю, что-то получилось благодаря операциям ImageIO? Поскольку образец написан, он (в идеале) не используется.

Кроме того, вы не утилизируете Graphics2D до начала процесса ImageIO. Часто это не имеет значения, но вы не хотите этого предполагать.

...