// ImageToBmp import java.awt.image.*; import java.io.*; public class ImageToBmp { public static void imageToBmpFile(BufferedImage image, File outputfile) throws Exception { byte[] bmpdata=imageToBmpFileBytes(image); writeFile(outputfile,bmpdata); } public static void imagePixelsToBmpFile(int[] pixels, int width, int height, File outputfile) throws Exception { byte[] bmpdata=imagePixelsToBmpFileBytes(pixels,width,height); writeFile(outputfile,bmpdata); } public static byte[] imageToBmpFileBytes(BufferedImage image) { int width=image.getWidth(), height=image.getHeight(); int[] pixels=image.getRGB(0,0,width,height,null,0,width); byte[] bmpdata=imagePixelsToBmpFileBytes(pixels,width,height); return bmpdata; } public static byte[] imagePixelsToBmpFileBytes(int[] pixels, int width, int height) { // Variables int rowlength=((width*3-1)/4+1)*4, filesize=54+height*rowlength; byte[] data=new byte[filesize]; // File Header setValue(data,0,2,0x4d42); setValue(data,2,4,filesize); setValue(data,6,2,0); setValue(data,8,2,0); setValue(data,10,4,0x36); // DIB Header setValue(data,14,4,0x28); // Header size setValue(data,18,4,width); setValue(data,22,4,height); setValue(data,26,2,1); setValue(data,28,2,0x18); // Bits per pixel setValue(data,30,4,0); // No compression setValue(data,34,4,height*rowlength); setValue(data,38,4,0); setValue(data,42,4,0); setValue(data,46,4,0); setValue(data,50,4,0); // Image data int padding=rowlength-width*3, offset=54; for (int y=height-1; y>=0; y--) { for (int x=0; x0) { setValue(data,offset,padding,0); offset+=padding; } } // Return bytedata return data; } private static void setValue(byte[] data, int offset, int length, int value) { if (length==1) { data[offset]=getByte(value); return; } if (length==2) { data[offset]=getByte(value&0xFF); data[offset+1]=getByte((value&0xFF00)>>8); return; } if (length==3) { data[offset]=getByte(value&0xFF); data[offset+1]=getByte((value&0xFF00)>>8); data[offset+2]=getByte((value&0xFF0000)>>16); return; } if (length==4) { data[offset]=getByte(value&0xFF); data[offset+1]=getByte((value&0xFF00)>>8); data[offset+2]=getByte((value&0xFF0000)>>16); data[offset+3]=getByte((value&0xFF000000)>>24); return; } System.out.println("ImageToBmp.setValue(...,"+offset+","+length+","+value+"): Invalid length"); System.exit(1); } private static byte getByte(int value) { if (value<=127) { return (byte)(value); } else { return (byte)(value-256); } } private static void writeFile(File file, byte[] data) throws Exception { FileOutputStream output=new FileOutputStream(file); output.write(data); output.flush(); output.close(); } }