Zeichnen eines Bildes aus Datei (BufferedImage, setRGB())



  • Hallo,

    ich habe ein Grauwertbild (8 Bit Grauwerte pro Pixel) in einem eignen Dateiformat abgespeichert und möchte es auf dem Bildschirm anzeigen. Dazu lese ich erst den Header aus (funktioniert) und danach die einzelnen Bildpunkte byteweise und schreibe sie mit der Methode setRGB(x,y,pixel) in ein BufferedImage vom Typ TYPE_BYTE_GRAY.

    Wenn ich in einem Applet eine Instanz meiner Klasse erzeuge und ein Bild mit

    g.drawImage(image.getImage(),0,0,256,256,this);

    zeichne, wird dieses falsch dargestellt. D.h. das Bild besteht anstatt aus verschieden Grauwerten nur aus schwarzen und weißen Bildpunkten, so als würde man das Grauwertbild in ein Binärbild umwandeln?

    Woran könnte das liegen?

    Bin für jeden Rat dankbar.

    MfG Michael

    import java.awt.image.BufferedImage;
    import java.io.*;
    
    public class GetImage {
    
            private int height, width, number;
            private DataInput source;
            private BufferedImage bild;
    
            GetImage(String url) throws IOException
            {
                    try
                    {
                            source = new DataInputStream(new FileInputStream(url));
                    } catch (Exception e)
                    {
                            System.out.println("Error1");
                    }
    
                    try
                    {
                            // header einlesen
                            for(int i=0; i<=16; i++)
                            {
                                    byte b = (byte) source.readByte();
    
    				/*
    				.
    				.
    				.
    				*/
                             }
    
                            //TYPE_BYTE_GRAY
                            bild = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    
                            // Bild einlesen
                            for(int y=0; y <= height-1; y++)
                            {
                                    for(int x=0; x <= width-1; x++)
                                    {
                                            byte b = (byte) source.readByte();
                                            bild.setRGB(x, y, b);
                                    }
                            }
    
                    }
                    catch (EOFException e)
                    {
                            //System.out.println("Error2");
                    }
            }
    
    	/*
    	:
    	:
    	*/
    
            public BufferedImage getImage()
            {
                    return bild;
            }
    }
    


  • Hallo.
    setRGB erwartet einen RGB-Wert (also einen Integer, der die einzelnen Farbanteile beschreibt).
    Du musst also deinen Grau-Wert in einen RGB-Wert umrechnen.
    (z.b. mit new Color(r,g,b).getRGB())
    (Bei Grau sollte r=g=b sein)

    Was du aber anscheinend vor hast, geht in Java eleganter.
    Du kannst die Klasse MemoryImageSource verwenden um ein Bild direkt aus dem Speicher zu erzeugen und dabei schon das passende ColorModel angeben.
    Das sähe in deinem Fall etwa so aus:

    bild = createImage(new MemoryImageSource(width, height, new DirectColorModel(8,0xff,0xff,0xff), pixel, 0, width));

    Wobei pixel ein Byte-Array ist. (In deinem Fall kannst du das mit source.read(pixel);
    auslesen.



  • Hallo Tendor,

    danke für Deine Hilfe. Mit createImage() funktionierts einwandfrei.

    Allerdings ist mir noch nicht klar wieso das mit dem BufferedImage nicht funktioniert, egal ob ich die Farbe als int, byte oder Color übergebe. Ist aber auch nicht mehr so wichtig, da ich jetzt ja eine funktionierende Lösung habe.

    Gruss Michael


Anmelden zum Antworten