2009-06-25 3 views
2

Es fällt mir schwer herauszufinden, wie man ein Image (oder ImageIcon) in einem Java-Applet zeigt. Das Folgende ist mein Code. Das Bild (test.bmp) existiert und ist auf dem D-Laufwerk, aber wenn ich das ausführe, bekomme ich das Applet-Fenster mit nichts darin. Kann mir jemand sagen, was ich vermisse, um ImageIcon zu zeigen?Wie kann ich ein Bitmap-Bild in einem Java-Applet anzeigen?

public class Form1 extends JApplet { 
    ImageIcon i; 

    public void init(){ 
     i = new ImageIcon("D:\test.bmp"); 
    } 

    public void paint(Graphics g){ 
     i.paintIcon(this, g, 0, 0); 
    } 
} 

Danke, Steve.

Antwort

7

Referenzierung Ihr Bild durch eine absolute lokale Dateipfad funktioniert möglicherweise nicht, wenn Sie Ihr Applet von einem Server ausführen. Verwenden Sie den ImageIcon (URL-Standort) -Konstruktor und Lassen Sie den URL auf die Bildressource auf dem Server verweisen. Verwenden Sie die JApplet.getCodeBase(), um festzustellen, woher Ihr Applet stammt, und hängen Sie den Dateinamen an.

public class Form1 extends JApplet { 
    Image i; 

    public void init() { 
     try { 
      i = ImageIO.read(new URL(getCodeBase(), "test.bmp")); 
     } catch (MalformedURLException ex) { 
      ex.printStackTrace(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public void paint(Graphics g) { 
     g.drawImage(i, 0, 0, null); 
    } 
} 

Edit: ImageIO unterstützt BMP und die geänderte Probe für mich funktioniert.

Edit 2: Wenn es immer noch das Bild nicht angezeigt werden, versuchen Sie „../test.bmp“, weil, wenn Sie ein Applet laufen von Eclipse-kann sagen, dass es das bin Verzeichnis wie die Code-Basis hat.

Edit 3: Wenn Sie Ihren Test stellen.bmp in das Glas oder auf dem Classpath, können Sie laden Sie es auf die gleiche Weise verwenden, aber

new URL(getCodeBase(), "test.bmp") 

mit

Form1.class.getResource("test.bmp") 
5

Zunächst ist es wahrscheinlich eine gute Idee, Ihr \ as \\ richtig zu entkommen.

Bearbeitet, um hinzuzufügen: Sie möchten wahrscheinlich das Äquivalent von Path.combine (oder File.join) Ihrer Sprache (oder Bibliothek) lernen, das eine Methode ist, eine Liste von Dateipfadteilen zu erstellen und sie mit dem Plattform-geeigneten zu kombinieren Pfadtrennzeichen. Oder Sie können es selbst schnell in Java schreiben, da der Pfadtrenner in File.pathSeparator dokumentiert ist.

(Von meinem Kopf wusste ich nicht, dass Vorwärts Schrägstrich immer in ImageIcon funktioniert, aber beachten Sie die andere Antwort, die dies anzeigt).

Stellen Sie außerdem sicher, dass Sie einen unterstützten Dateityp wie .png, .gif oder .jpg laden. BMP wird möglicherweise in JDK unterstützt. 1.5

Wenn Sie in einem Applet-Kontext ausgeführt werden, haben Sie aufgrund von Sandbox-Regeln möglicherweise keinen Zugriff auf den betreffenden Pfad. In diesem Fall stellen Sie sie im selben Pfad zur HTML-Datei bereit, in der sich das Applet befindet (möglicherweise im Pfad von Jar, wenn der Speicher für mich verwendet wird), und verwenden Sie einen relativen Pfad.

+0

Ich denke, wir haben einen Gewinner. Hätte er seine Datei "imagetest.bmp" genannt, wäre das Problem offensichtlich gewesen. –

+1

+1 das ist wahrscheinlich das Problem. Der einzige Grund, warum Sie keinen Compilerfehler erhalten, ist, dass "\ t" eine gültige Escape-Sequenz für das Tab-Zeichen ist. –

+0

Was bringt uns zur zweiten Lektion: Überprüfen Sie, ob init (Öffnen der Datei) erfolgreich war. – schnaader

0

Vom Java Docs:

Wenn Sie einen Pfad angeben, verwenden Sie die Internet-Standard-Schrägstrich ("/") als Separator

1

Anstatt eine ImageIcon machen, die erzählt ersetzt wird sich auf eine Grafik zu zeichnen, versuchen es auf diese Weise:

public class Form1 extends JApplet { 
    Image i; 

    public void init(){ 
     i = getImage("D:\\test.bmp"); 
    } 

    public void paint(Graphics g){ 
     g.drawImage(i,0,0,this); 
    } 
} 

Sie können auch versuchen,. Png anstelle einer BMP-Datei verwenden.

0

bmp-Dateien werden in Java nicht unterstützt.

Sie sollten wahrscheinlich unsing andere Formate wie PNG, GIF oder .jpg

betrachten Wenn Sie wirklich es zu tun haben, hier ein Artikel von Java-Welt, die erklärt, wie die Bitmap-Datei lesen und interpretiere es.

Java Tip 43: How to read 8- and 24-bit Microsoft Windows bitmaps in Java applications von JavaWorld

habe ich noch nie versucht, obwohl

+2

BMP wird in Swing/ImageIcon nicht unterstützt. ImageIO ist jedoch glücklich, es zu lesen (ref: http://forums.sun.com/thread.jspa?threadID=666189) – akarnokd

1

ImageJ eine Open-Source-Anwendung/Bibliothek, die Unterstützung für die Mai-Formate, einschließlich BMP hat. Hier

ist einige echte Code BMPDecoder von ImageJ:

Hier ist die license statement.

import java.awt.image.ColorModel; 
import java.awt.image.IndexColorModel; 
import java.awt.image.MemoryImageSource; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class BMPDecoder { 
    InputStream is; 
    int curPos = 0; 

    int bitmapOffset; // starting position of image data 

    int width; // image width in pixels 
    int height; // image height in pixels 
    short bitsPerPixel; // 1, 4, 8, or 24 (no color map) 
    int compression; // 0 (none), 1 (8-bit RLE), or 2 (4-bit RLE) 
    int actualSizeOfBitmap; 
    int scanLineSize; 
    int actualColorsUsed; 

    byte r[], g[], b[]; // color palette 
    int noOfEntries; 

    byte[] byteData; // Unpacked data 
    int[] intData; // Unpacked data 
    boolean topDown; 

    private int readInt() throws IOException { 
     int b1 = is.read(); 
     int b2 = is.read(); 
     int b3 = is.read(); 
     int b4 = is.read(); 
     curPos += 4; 
     return ((b4 << 24) + (b3 << 16) + (b2 << 8) + (b1 << 0)); 
    } 

    private short readShort() throws IOException { 
     int b1 = is.read(); 
     int b2 = is.read(); 
     curPos += 2; 
     return (short) ((b2 << 8) + b1); 
    } 

    void getFileHeader() throws IOException, Exception { 
     // Actual contents (14 bytes): 
     short fileType = 0x4d42;// always "BM" 
     int fileSize; // size of file in bytes 
     short reserved1 = 0; // always 0 
     short reserved2 = 0; // always 0 

     fileType = readShort(); 
     if (fileType != 0x4d42) 
      throw new Exception("Not a BMP file"); // wrong file type 
     fileSize = readInt(); 
     reserved1 = readShort(); 
     reserved2 = readShort(); 
     bitmapOffset = readInt(); 
    } 

    void getBitmapHeader() throws IOException { 

     // Actual contents (40 bytes): 
     int size; // size of this header in bytes 
     short planes; // no. of color planes: always 1 
     int sizeOfBitmap; // size of bitmap in bytes (may be 0: if so, 
          // calculate) 
     int horzResolution; // horizontal resolution, pixels/meter (may be 0) 
     int vertResolution; // vertical resolution, pixels/meter (may be 0) 
     int colorsUsed; // no. of colors in palette (if 0, calculate) 
     int colorsImportant; // no. of important colors (appear first in 
           // palette) (0 means all are important) 
     int noOfPixels; 

     size = readInt(); 
     width = readInt(); 
     height = readInt(); 
     planes = readShort(); 
     bitsPerPixel = readShort(); 
     compression = readInt(); 
     sizeOfBitmap = readInt(); 
     horzResolution = readInt(); 
     vertResolution = readInt(); 
     colorsUsed = readInt(); 
     colorsImportant = readInt(); 

     topDown = (height < 0); 
     if (topDown) 
      height = -height; 
     noOfPixels = width * height; 

     // Scan line is padded with zeroes to be a multiple of four bytes 
     scanLineSize = ((width * bitsPerPixel + 31)/32) * 4; 

     actualSizeOfBitmap = scanLineSize * height; 

     if (colorsUsed != 0) 
      actualColorsUsed = colorsUsed; 
     else 
     // a value of 0 means we determine this based on the bits per pixel 
     if (bitsPerPixel < 16) 
      actualColorsUsed = 1 << bitsPerPixel; 
     else 
      actualColorsUsed = 0; // no palette 
    } 

    void getPalette() throws IOException { 
     noOfEntries = actualColorsUsed; 
     // IJ.write("noOfEntries: " + noOfEntries); 
     if (noOfEntries > 0) { 
      r = new byte[noOfEntries]; 
      g = new byte[noOfEntries]; 
      b = new byte[noOfEntries]; 

      int reserved; 
      for (int i = 0; i < noOfEntries; i++) { 
       b[i] = (byte) is.read(); 
       g[i] = (byte) is.read(); 
       r[i] = (byte) is.read(); 
       reserved = is.read(); 
       curPos += 4; 
      } 
     } 
    } 

    void unpack(byte[] rawData, int rawOffset, int bpp, byte[] byteData, 
      int byteOffset, int w) throws Exception { 
     int j = byteOffset; 
     int k = rawOffset; 
     byte mask; 
     int pixPerByte; 

     switch (bpp) { 
     case 1: 
      mask = (byte) 0x01; 
      pixPerByte = 8; 
      break; 
     case 4: 
      mask = (byte) 0x0f; 
      pixPerByte = 2; 
      break; 
     case 8: 
      mask = (byte) 0xff; 
      pixPerByte = 1; 
      break; 
     default: 
      throw new Exception("Unsupported bits-per-pixel value: " + bpp); 
     } 

     for (int i = 0;;) { 
      int shift = 8 - bpp; 
      for (int ii = 0; ii < pixPerByte; ii++) { 
       byte br = rawData[k]; 
       br >>= shift; 
       byteData[j] = (byte) (br & mask); 
       // System.out.println("Setting byteData[" + j + "]=" + 
       // Test.byteToHex(byteData[j])); 
       j++; 
       i++; 
       if (i == w) 
        return; 
       shift -= bpp; 
      } 
      k++; 
     } 
    } 

    void unpack24(byte[] rawData, int rawOffset, int[] intData, int intOffset, 
      int w) { 
     int j = intOffset; 
     int k = rawOffset; 
     int mask = 0xff; 
     for (int i = 0; i < w; i++) { 
      int b0 = (((int) (rawData[k++])) & mask); 
      int b1 = (((int) (rawData[k++])) & mask) << 8; 
      int b2 = (((int) (rawData[k++])) & mask) << 16; 
      intData[j] = 0xff000000 | b0 | b1 | b2; 
      j++; 
     } 
    } 

    void unpack32(byte[] rawData, int rawOffset, int[] intData, int intOffset, 
      int w) { 
     int j = intOffset; 
     int k = rawOffset; 
     int mask = 0xff; 
     for (int i = 0; i < w; i++) { 
      int b0 = (((int) (rawData[k++])) & mask); 
      int b1 = (((int) (rawData[k++])) & mask) << 8; 
      int b2 = (((int) (rawData[k++])) & mask) << 16; 
      int b3 = (((int) (rawData[k++])) & mask) << 24; // this gets 
                  // ignored! 
      intData[j] = 0xff000000 | b0 | b1 | b2; 
      j++; 
     } 
    } 

    void getPixelData() throws IOException, Exception { 
     byte[] rawData; // the raw unpacked data 

     // Skip to the start of the bitmap data (if we are not already there) 
     long skip = bitmapOffset - curPos; 
     if (skip > 0) { 
      is.skip(skip); 
      curPos += skip; 
     } 

     int len = scanLineSize; 
     if (bitsPerPixel > 8) 
      intData = new int[width * height]; 
     else 
      byteData = new byte[width * height]; 
     rawData = new byte[actualSizeOfBitmap]; 
     int rawOffset = 0; 
     int offset = (height - 1) * width; 
     for (int i = height - 1; i >= 0; i--) { 
      int n = is.read(rawData, rawOffset, len); 
      if (n < len) 
       throw new Exception("Scan line ended prematurely after " + n 
         + " bytes"); 
      if (bitsPerPixel == 24) 
       unpack24(rawData, rawOffset, intData, offset, width); 
      else if (bitsPerPixel == 32) 
       unpack32(rawData, rawOffset, intData, offset, width); 
      else 
       // 8-bits or less 
       unpack(rawData, rawOffset, bitsPerPixel, byteData, offset, 
         width); 
      rawOffset += len; 
      offset -= width; 
     } 
    } 

    public void read(InputStream is) throws IOException, Exception { 
     this.is = is; 
     getFileHeader(); 
     getBitmapHeader(); 
     if (compression != 0) 
      throw new Exception("Compression not supported"); 
     getPalette(); 
     getPixelData(); 
    } 

    public MemoryImageSource makeImageSource() { 
     ColorModel cm; 
     MemoryImageSource mis; 

     if (noOfEntries > 0) { 
      // There is a color palette; create an IndexColorModel 
      cm = new IndexColorModel(bitsPerPixel, noOfEntries, r, g, b); 
     } else { 
      // There is no palette; use the default RGB color model 
      cm = ColorModel.getRGBdefault(); 
     } 

     // Create MemoryImageSource 

     if (bitsPerPixel > 8) { 
      // use one int per pixel 
      mis = new MemoryImageSource(width, height, cm, intData, 0, width); 
     } else { 
      // use one byte per pixel 
      mis = new MemoryImageSource(width, height, cm, byteData, 0, width); 
     } 

     return mis; // this can be used by Component.createImage() 
    } 

    public static void main(String[] aqgs) { 
     BMPDecoder bd = new BMPDecoder(); 
     try { 
      bd.read(BMPDecoder.class.getResourceAsStream("bmp.bmp")); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     JFrame jf = new JFrame(); 
     JLabel jl = new JLabel(); 
     ImageIcon ii = new ImageIcon(jl.createImage(bd.makeImageSource())); 
     jl.setIcon(ii); 
     jf.add(jl); 
     jf.pack(); 
     jf.setVisible(true); 
    } 
} 
Verwandte Themen