2009-03-13 6 views
2

Итак, я публиковал все и еще должен получить солидный ответ:Как я могу накладывать изображения друг на друга в Java?

Я создал образ, изменяющий размер, с методом обрезки. Обрезка отлично работает. Проблема, которая у меня возникает, - это цвет фона, который я указываю в функции drawImageGraphics, работает некорректно. Он по умолчанию является черным в качестве фона независимо от того, что я поставлю (в данном случае 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); 
} 

ответ

1

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

this.OutputImage = NewImage; 

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

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

+0

Спасибо за ответ, очень высокая оценки Насколько изолируя его странно, я удалил все, отложите вещи и только что создал новый буферизованный образ и setBackgroundColor и назначен this.OutputImage и я все еще получаю черный фон. Кроме того, просто для очистки, я использую Graphics - not Graphics2D. – 2009-03-14 19:01:04

+0

Как выглядит новый код? Установка только цвета фона не изменит изображение - оно используется только в ясных операциях (clearRect, возможно, Graphics2D composites?). –

1

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

+0

Вот решение: \t \t \t \t // установить фон \t \t \t \t MyGraphics.setBackground (Color.decode (this.BackgroundColor)); \t \t \t \t \t \t \t \t // ясно Rect \t \t \t \t MyGraphics.clearRect (0, 0, ширина, высота); Спасибо за вашу помощь! – 2009-03-16 21:48:48