/************************* 會考題第六題:BMP轉ASCII圖檔 **************************/ import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.io.*; public class b6 extends JFrame //畫圖物件是JFrame的擴充 { Container c; Color bgcolor=Color.white; Color textcolor=Color.red; JButton rot0,rot1; JLabel lab1=new JLabel("來源檔名:"); JLabel lab2=new JLabel("ASCII檔名:"); imgZ1 Z1= new imgZ1(); JTextField text_s,text_d; public b6() //建構元 { super("轉換ASCII圖形"); c=getContentPane(); rot1=new JButton("轉換"); rot0=new JButton("結束"); text_s=new JTextField("source file",10); text_d=new JTextField("Dest file",10); setSize(400,300); c.setLayout(new FlowLayout(FlowLayout.CENTER)); c.add(lab1); c.add(text_s); c.add(lab2); c.add(text_d); c.add(rot1); c.add(rot0); rot0.addActionListener(Z1); rot1.addActionListener(Z1); show(); } public void paint(Graphics g) //真正的畫圖設定 { super.paint(g); } class imgZ1 implements ActionListener { int data[][][]=new int[300][300][3];//300*300*3 integer char ndata[][]=new char[100][100];//step must larger than 3 int row_num=0,col_num=0; byte header[]=new byte[54];//54位元表頭 public void file_read() throws IOException //讀取bmp檔 { int x,y,k; RandomAccessFile fr=new RandomAccessFile(text_s.getText(),"r");//開檔 fr.read(header,0,54);//跳過表頭 for (y=0;y<300;y=y+1) for (x=0;x<300;x=x+1) for (k=0;k<3;k=k+1) data[y][x][k]=fr.readUnsignedByte();//讀三元色,並且處理補數問題 fr.close(); } public void actionPerformed(ActionEvent e) { int x,y,i,j,k; byte tmp; final int step=10; long sum; char oc; if (e.getSource()==rot0)//結束 { System.exit(0); } try {file_read();} catch(IOException e1) { System.out.println(text_s.getText()+"Reading Error!"); } /***透過檢查那個按鈕呼叫的,就可以判定該做的動作 ***/ if (e.getSource()==rot1)//轉換ASCII碼 { row_num=0; for (y=0;y<300;y=y+step) { col_num=0; for (x=0;x<300;x=x+step)//針對每個block { sum=0; //計算方塊內的圖素總和 for (j=y;j=0) oc='@'; else if (sum<=63 && sum>=32) oc='M'; else if (sum<=95 && sum>=64) oc='W'; else if (sum<=127 && sum>=96) oc='N'; else if (sum<=159 && sum>=128) oc='X'; else if (sum<=191 && sum>=160) oc='I'; else if (sum<=223 && sum>=192) oc='*'; else if (sum<=255 && sum>=224) oc='.'; else System.out.println(sum); ndata[row_num][col_num]=oc; col_num=col_num+1; }//for x row_num=row_num+1; }//for y } try {//寫入文字檔 FileWriter fw=new FileWriter(text_d.getText()); BufferedWriter bfw=new BufferedWriter(fw); for (i=row_num-1;i>=0;i=i-1) { bfw.write(ndata[i],0,col_num); bfw.newLine(); } bfw.flush(); fw.close(); } catch(IOException e1) { System.out.println(text_d.getText()+"Open Error!"); } repaint(); //重新顯示一次 } } public static void main(String args[]) //程式起點 { b6 app=new b6(); //啟動物件 app.addWindowListener(new WindowAdapter(){ //匿名內部類別 public void windowClosing(WindowEvent e) { System.exit(0); } }); //處理視窗關閉要求 } }