本人刚接触EMS,还有很多地方不明 这个程序对16*16,32*32,72*14有效,可直接得到要发送的byte[140],40*35还没测试,本着公开源码的精神,献丑了
//victorachc@163.com import java.io.*;
public class preResult{ //pos is the pixel data start postion private int pos; //bitmap's width and height private byte w; private byte h; //bmp is byte[] of the bmp file private byte[] bmp; //result is the byte[] which save the result private byte[] result = new byte[140]; //result[] length private int rlen;
protected preResult(String fn) throws IOException { FileInputStream fin = new FileInputStream(fn); //read bmpdata to byte array bmp int bmplen = fin.available(); bmp = new byte[bmplen]; fin.read(bmp); w=bmp[18]; h=bmp[22]; fin.close(); }
//check if it is 1 bit/pixel public void isValid() throws Exception { if(bmp[28]==1) return; else throw new Exception("pixel is not 1"); }
//check if the bmp length is valid public boolean checkDataLen() throws Exception { int len=(bmp[2]-bmp[10])>=0?(bmp[2]-bmp[10]):(bmp[2]-bmp[10]+256); if (len==(w*h/8)){ return true; } else if(len*3/4==w*h/8){ System.out.println("This is variable bmp!"); return true; } else throw new Exception("length is invalid"); }
public void getHead() throws Exception { if(w==16&&h==16){ result[0]=35; result[1]=17; result[2]=33; result[3]=0; pos=4; rlen=36; return; } else if(w==32&&h==32){ result[0]=-125; result[1]=16; result[2]=-127; result[3]=0; pos=4; rlen=132; return; } else if(((w%8)==0)&&((w*h)<=1024)){ int p=w*h/8+5; result[0]=(byte)((p<=127)?p:(p-256)); result[1]=18; result[2]=(byte)(result[0]-2); result[3]=0; result[4]=(byte)(w/8); result[5]=h; pos=6; rlen=p+1; return; } throw new Exception("header error"); }
public void getBody(){ //according to the EMS specification,w is w/8 int wid=w/8; if(pos==4){ //lh is loop height,lw is loop width for(int lh=0;lh<h;lh++){ for(int i=bmp.length-(lh+1)*wid;i<bmp.length-lh*wid;i++){ result[pos] = bmp[i]; pos++; } } } else if(pos==6){ wid = wid+3; for(int lh=0;lh<h;lh++){ for(int i=bmp.length-(lh+1)*wid;i<bmp.length-lh*wid;i++){ if(i<bmp.length-lh*wid-3){ result[pos] = bmp[i]; pos++; } } } } //result has been build,you can check the byte[] here }
public void putResultIntoFile() throws IOException{ FileOutputStream fout = new FileOutputStream("test.tmp"); fout.write(result); fout.close(); }
public static void main(String[] args) throws IOException,Exception { preResult pR = new preResult("d:\\Tom.bmp"); pR.isValid(); try{ pR.checkDataLen(); } catch(Exception e){e.printStackTrace();} pR.getHead(); pR.getBody(); pR.putResultIntoFile(); } }
这段程序参考了斑竹:BMP结构! 的帖子,不正确的地方,请指教!
(出处:http://www.vipcn.com)
|