WritableRaster -> BufferedImage .. falsche Farben

teppi

Erfahrenes Mitglied
Hallo,

ich kreiere aus einem BufferedImage ein WritableRaster .. von diesem WritableRaster erzeuge ich ein kleineres WritableRaster, welches sich dort drin befindet. Wenn ich das neue WritableRaster einem neuen Bild hinzufüge werden die Farben fasch dargestellt.

Was mach ich falsch? :)

Code:
		this.mainRaster = mainMapImage.getRaster();
		
		System.out.println(mainRaster.getHeight());
		
		// entsprechenden Bereich ausschneiden
		this.tempRaster = mainRaster.createWritableChild( imageWidth , imageHeight, imageWidth , imageHeight , 0 , 0 , new int[]{0});
		
		// hier die kritische Stelle .. 
		this.visibleMapImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_BYTE_INDEXED);
						
		visibleMapImage.setData(this.tempRaster);
		
		this.myMap.setImage(visibleMapImage);

Und hier ein Bild wies aussieht: das Grün sollte eher ein Rosa sein oder so ..
Screenshot

Und hier wie das Bild reinkommen müsste:
Karte

Danke schön!
 
Zuletzt bearbeitet:
Hallo!

Ich denke die Falschfarbendarstellung entsteht dadruch, dass du dieses child BufferedImage mit einem BufferedImage.TYPE_BYTE_INDEXED erstellst. Du solltest schon den selben Typ wie des parent Image benutzen...

Verwende doch den passenden Konstruktor ;)
Schau mal hier:
Code:
 /**
  * 
  */
 package de.tutorials;
 
 import java.awt.image.BufferedImage;
 import java.awt.image.WritableRaster;
 import java.io.File;
 
 import javax.imageio.ImageIO;
 import javax.swing.ImageIcon;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 
 /**
  * @author Thomas
  * 
  */
 public class ImageExample {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		BufferedImage image = ImageIO.read(new File("c:/winter.jpg"));
 		WritableRaster writableRaster = image.getRaster();
 		
 		WritableRaster childRaster = writableRaster.createWritableChild(0,0,100,100,0,0,null);
 		BufferedImage childImage = new BufferedImage(image.getColorModel(),childRaster,image.isAlphaPremultiplied(),null);
 		
 		JFrame frm = new JFrame("ImageExample");
 		frm.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE);
 		frm.add(new JLabel(new ImageIcon(childImage)));
 		frm.pack();
 		frm.setVisible(true);
 	}
 
 }

btw. was willst du damit eigentlich machen? Wenn du nur einen kleinen Bildausschnitt eines groessen Bildes haben moechtest koenntest du auch getSubImage(...) verwenden.

Gruss Tom
 
Oh mein Gott, die Funktion hab ich glatt übersehen .. Die ist natürlich viel praktischer. Ich hatte vorher ein Projekt, wo ich an den Pixeln rumwerkeln musste. Ich bin scheinbar etwas betriebsblind geworden.

Vielen Dank,
schönen Abend wünsch ich dir,
Stefan ;)
 
Zurück