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