2013-02-14 71 views
1

我嘗試從BufferedImage製作BMP文件。這裏的功能是我嘗試在bmp文件中寫入標題和像素。Java BMP頭文件

我有一個錯誤,但我找不到。我需要你的幫助。

static void writeToBMP(BufferedImage img, String name) 
{ 
    //File header 
    int bfType = 0x424d; 
    int bfSize = (img.getHeight()*img.getWidth()*3)+54; // File size 
    short bfReserved1 = 0; // Reserved 
    short bfReserved2 = 0; 
    int bfOfBytes = 54; // Header size 

    //Header info 
    int biSize = 40; // Header 2 size 
    int biWidth = img.getWidth(); // Width in pixels 
    int biHeight = img.getHeight(); // Height in pixels 
    short biPlanes = 1; // Nr of planes 
    short biBitCount = 24; // Nr bites per pixel 
    int biCompression = 0; 
    int biSizeImage = (img.getHeight()*img.getWidth()*3); // Image size 
    int biXPelsPerMeter = 0; 
    int biYPelsPerMeter = 0; 
    int biClrUsed = 0; 
    int biClrImportant = 0; 

    File file = new File(name); 

    try { 
     OutputStream stream = new FileOutputStream(file); 
     fOut = new DataOutputStream(stream); 
     fOut.writeShort(bfType); 
     fOut.writeInt(bfSize); 
     fOut.writeShort(bfReserved1); 
     fOut.writeShort(bfReserved2); 
     fOut.writeInt(bfOfBytes); 

     //Write Header Info 
     fOut.writeInt(biSize); 
     fOut.writeInt(biWidth); 
     fOut.writeInt(biHeight); 
     fOut.writeShort(biPlanes); 
     fOut.writeShort(biBitCount); 
     fOut.writeInt(biCompression); 
     fOut.writeInt(biSizeImage); 
     fOut.writeInt(biXPelsPerMeter); 
     fOut.writeInt(biYPelsPerMeter); 
     fOut.writeInt(biClrUsed); 
     fOut.writeInt(biClrImportant); 
     for(int x=0; x<img.getWidth(); x++) 
     { 
      for(int y=0; y<img.getHeight(); y++) 
      { 
       Color c = new Color(img.getRGB(x,y)); 
       fOut.writeByte(c.getRed()); 
       fOut.writeByte(c.getBlue()); 
       fOut.writeByte(c.getGreen()); 
      } 
     } 
     fOut.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

我試着只寫頭,頭大小= 54字節。

我不知道我是否計算正確的bfSize和biSizeImage。

+0

你必須手動做到這一點,或者你可以使用[ImageIO.write()](http://docs.oracle.com/javase/6/docs/api/javax/的ImageIO/ImageIO.html#寫%28java.awt.image.RenderedImage,%20java.lang.String,%20java.io.File 29%)? – 2013-02-14 22:23:53

回答

1

要解決我的問題,我需要使用LITTLE_ENDIAN字節順序。爲此,我使用:

ByteBuffer buffer = ByteBuffer.allocate(54); 
    buffer.putInt(bfSize); 
    buffer.putShort(bfReserved1); 
    buffer.putShort(bfReserved2); 
    buffer.putInt(bfOfBytes); 
    buffer.putInt(biSize); 
    buffer.putInt(biWidth); 
    buffer.putInt(biHeight); 
    buffer.putShort(biPlanes); 
    buffer.putShort(biBitCount); 
    buffer.putInt(biSizeImage); 
    buffer.putInt(biXPelsPerMeter); 
    buffer.putInt(biYPelsPerMeter); 

    buffer.order(ByteOrder.LITTLE_ENDIAN); 
    buffer.flip(); 
+0

填充也必須照顧! – AVA 2015-03-17 08:57:49

2

嘗試使用ImageIO的

File outImage = new File(name); 
ImageIO.write(img, "bmp", outImage); 
+0

使用Image.IO我可以導出,但我需要編寫自己的標題和圖像。 – daniftodi 2013-02-14 22:35:46

+0

@unnene有什麼區別? – MadProgrammer 2013-02-14 23:23:06

+0

我在上大學這個問題,我需要自己創建位圖圖像。 – daniftodi 2013-02-15 09:36:21