2013-02-14 8 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를 계산했는지 알 수 없습니다. 내가 LITTLE_ENDIAN 바이트 순서를 사용할 필요가 내 문제를 해결하려면 ImageIO에서

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

당신이 수동으로 수행해야 또는 [ImageIO.write()] (http://docs.oracle.com/javase/6/docs/api/javax/를 사용할 수 있습니까 imageio/ImageIO.html # write % 28java.awt.image.RenderedImage, % 20java.lang.String, % 20java.io.File % 29)? –

답변

1

를 사용

+0

충전재도 처리해야합니다! – AVA

2

보십시오. 이를 위해 내가 사용

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

Image.IO에서 내보낼 수 있지만 머리글과 이미지를 직접 작성해야합니다. – daniftodi

+0

@unNene 차이점은 무엇입니까? – MadProgrammer

+0

나는 대학에서이 문제를 겪었고, 나는 스스로 비트 맵 이미지를 만들어야한다. – daniftodi