PGM darstellen

Status
Nicht offen für weitere Antworten.

UdjENE

Mitglied
Hi,
ich möchte auf meiner Gui ein PGM-Bild darstellen. Nachdem ich es ausprobiert habe
Code:
ImageIO.read(new File("bild.pgm"))
bekam ich nur eine Fehlermeldung und nix wurde angezeigt. Ich dachte daran, die einzelnen Bytes auszulesen und Pixel für Pixel zu zeichnen, da ich ja die Breite und Höhe aus der PGM-Datei auslesen kann. Kennt jemand einen einfacheren Weg ein pgm darzustellen?
 
ganz einfach: imageio unterstützt pgm nicht. glaub java unterstützt die formate generell nicht. ironischerweise, die hat nämlich sun erfunden ^^

benutz ne andere lib wie z.b. jimi http://java.sun.com/products/jimi/ , die sollte das können. wenn das auch nicht klappt, guck dir mal das pgm format an (z.b. auf wikipedia) ist wirklich einfach und in nem 3 zeiler implementiert.
 
ok, also jimi unterstützt kein PGM. so ein PGM-Format ist nicht kompliziert. weiss jemand wie ich die Graustufen aus der PGM-Datei darstellen kann?
 
falls es jemanden interessiert, hier meine lösung:
Code:
roChannelPGM = new RandomAccessFile("socketNew\\schiff.pgm", "r").getChannel();
bufferPGM = roChannelPGM.map(FileChannel.MapMode.READ_ONLY, 0, (int)roChannelPGM.size());

protected void paintComponent( Graphics g ) { 
		
		int xStart = 10;
		int yStart = 10;
		String tmpWidth = "";
		String tmpHeight= "";
		int greyValue = 0;
		
		for(int i=0; i<bufferPGM.limit(); i++){
			output.write((char)bufferPGM.get(i));
		}	
		
		byte[] pgmCodeByte = output.toByteArray();
		int[] pgmCode = unsignedByteArrayToInt(pgmCodeByte);
		
		int n = 0;
		int count = 0;
		
		// ignoriere Zeichen bis zum 2. LineFeed
		while(count != 2){
			if(pgmCode[n] == 10)
				count++;
			n++;
		}
				
		//lese Bildbreite:
		do{
			tmpWidth += String.valueOf((char)pgmCode[n]);
			n++;
		}while(pgmCode[n] != 32);
		
		widthPGM = Integer.parseInt(tmpWidth);
		
		//lese Bildhöhe:
		n++;
		do{
			tmpHeight += String.valueOf((char)pgmCode[n]);
			n++;
		}while(pgmCode[n] != 10);
		
		heightPGM = Integer.parseInt(tmpHeight);
		
		//springe bis zum ersten Pixel:
		do{
			n++;
		}while(pgmCode[n] != 10);
	
		System.err.println(pgmCode[n]);
		
		n++;
		
		for(int y=0; y<heightPGM; y++){
			for(int x=0; x<widthPGM; x++){
				greyValue=pgmCode[n];
				g.setColor( new Color( greyValue, greyValue, greyValue) );
				g.drawLine( xStart+x, yStart+y, xStart+x, yStart+y );
				n++;
			}
		}
	}

naja ich bin noch nicht ganz zufrieden, weil das umwandeln von einem Byte-array in ein Int-array nimmt schon wertvolle Rechenzeit in Anspruch. weiss jemand wie man das verhindern kann??
wenn jemand eine andere Lösung hat, dann bitte posten.
 
Ich musste auch mal so etwas machen. Hier meine Lösung

Ich benutzte Graphics2D.drawImage(BufferedImage, BufferedImageOp, int, int) mit einem BufferedImage vom Typ TYPE_BYTE_GRAY.

Mit einem BufferedInputStream konnte ich die Daten quasi gratis auslesen. Dazu reicht nach dem PGM-Header einen Aufruf à la
inputStream.read( ((DataBufferByte)pgmImage.getRaster().getDataBuffer()).getData() );

Achte darauf, das BufferedImage bereits mit den richtigen Ausmassen zu erstellen. Die konntest du ja dem Header entnehmen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben