2009-03-13 6 views
2

So habe ich überall und haben noch eine solide Antwort zu bekommen:Wie kann ich Bilder in Java überlagern?

Ich habe eine Bild-Größenänderung Klasse erstellt, mit einer Crop-Methode. Das Zuschneiden funktioniert super. Das Problem, das ich habe, ist die Hintergrundfarbe, die ich in der drawImage Funktion von Graphics nicht richtig funktioniert. Es wird standardmäßig schwarz als Hintergrund verwendet, unabhängig davon, was ich bereitstelle (in diesem Fall Color.WHITE).

Auch das überlagernde Bild oder oberste Bild (kommt aus einer Datei) wird invertiert (ich denke es ist) oder sonst verfärbt. Nur damit Sie dies ein wenig besser verstehen können, ich nehme ein JPEG und überlagere es über einem neuen BufferedImage, der Hintergrund des neuen gepufferten Bildes wird nicht gesetzt. Hier ist der Code, unter dem ich arbeite mit:

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); 
} 

Antwort

1

Können Sie isolieren, ob es die Graphics-Methoden oder die ImageIO Methoden ist, dass Ihr Bild sind Mangeln? Es sieht aus wie Sie dies durch Kurzschließen des gesamten ImageIO Prozess testen konnte und einfach

this.OutputImage = NewImage; 

Für diese Angelegenheit Zuweisung ich nehme an, es ist etwas gewonnen durch die ImageIO Operationen? Wenn das Sample geschrieben wird, scheint es (im Idealfall) ein No-Op zu sein.

Außerdem haben Sie Ihre Graphics2D nicht bevor Sie den ImageIO-Prozess beginnen. Es macht oft keinen Unterschied, aber das wollen Sie nicht annehmen.

+0

Vielen Dank für die Antwort, sehr geschätzt Soweit isolierend, es ist komisch, ich entfernte alle über Laien Zeug und nur ein neues gepuffertes Bild und setBackgroundColor erstellt und diesem zugewiesen.OutputImage und ich bekomme immer noch einen schwarzen Hintergrund. Außerdem benutze ich Graphics - nicht Graphics2D. –

+0

Wie sieht der neue Code aus? Wenn Sie nur die Hintergrundfarbe einstellen, wird das Bild nicht verändert - es wird nur in den Löschoperationen verwendet (clearRect, möglicherweise Graphics2D-Composites?). Hier –

1

Stellen Sie bei Problemen mit der Overlay-Farbverzerrung sicher, dass sich der Grafikkontext im Malmodus und nicht im Xoder Modus befindet. (Graphics.setPaintMode()). Andernfalls werden die Farbbits zusammen XOR-verknüpft.

+0

ist die Lösung: \t \t \t \t // set Hintergrund \t \t \t \t MyGraphics.setBackground (Color.decode (this.BackgroundColor)); \t \t \t \t \t \t \t \t // klar rect \t \t \t \t MyGraphics.clearRect (0, 0, Breite, Höhe); Vielen Dank für Ihre Hilfe! –