import java.applet.Applet; import java.applet.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.awt.image.*; import javax.imageio.ImageIO; import java.io.*; import java.awt.image.BufferedImage; import java.util.Arrays; import com.sun.image.codec.jpeg.*;//提供存檔時所用的JPEG編碼器 import com.sun.image.codec.jpeg.JPEGImageEncoder; import java.awt.image.MemoryImageSource; import java.util.*; import java.nio.channels.*; import java.nio.*; import java.nio.channels.FileLock; import java.net.URL; public class m1 extends Applet implements ActionListener,ChangeListener,ItemListener { MediaTracker tracker; int flg=0; JLabel lab1,laba,labb; JTextField txt1,txta,txtb; Image img,pic[][]; String filename; JButton but1,but2,but3; int posX=0,posY=50,dx,dy,x,y; int xa,ya,xb,yb; int H,W,w3,h3; int a,b; //a是列,b是行 int imgx,imgy; JSlider zoom; double ratio=1.0; JLabel zo = new JLabel(); int picrx[][],pcx[][]; int picry[][],pcy[][]; int pr,pg,pb,sr,sg,sb; int hpr,hpg,hpb,hsr,hsg,hsb; int set[],seta[],set1[],setb[]; int hset[],hseta[]; int up[][],down[][],left[][],right[][]; int m=1000,g,q,gg; //搜尋範圍 int min,minup,mindown,minleft,minright; //最小誤差 int jpx=300,jpy=300; //每格幾點比對一次 int pixels[]; int leftpic[][][],rightpic[][][],uppic[][][],downpic[][][]; int X=5,w2=10,h2=10;; int tempW,tempH,temp[],picr,picg,picb; int startY; JComboBox cbox1; String cn1[]; FileLock inLock = null; RandomAccessFile inFile; int ln,on=0; public void init() { lab1=new JLabel("目錄名稱:"); laba=new JLabel("列:"); labb=new JLabel("行:"); txt1=new JTextField(10); txta=new JTextField(5); txtb=new JTextField(5); lab1.setBounds(10,10,100,20); laba.setBounds(190,10,100,20); labb.setBounds(260,10,100,20); txt1.setBounds(100,10,80,20); txta.setBounds(220,10,30,20); txtb.setBounds(290,10,30,20); but1=new JButton("切組"); but2=new JButton("組圖"); but3=new JButton("小圖"); but1.setBounds(330,10,60,20); but2.setBounds(390,10,60,20); but3.setBounds(450,10,60,20); zoom=new JSlider(JSlider.HORIZONTAL,0,200,100); zoom.setMajorTickSpacing(10);//設定座標 zoom.setPaintTicks(true);//畫出座標 zoom.setBounds(520,5,200,30); zo.setText("100%"); zo.setBounds(730,10,60,30); setLayout(null); //setLayout(new FlowLayout(FlowLayout.CENTER));//設定為流水版面設定 add(lab1); add(laba); add(labb); //add(txt1); add(txta); add(txtb); add(zoom); add(zo); zoom.addChangeListener(this); addMouseMotionListener(new procmouse()); addMouseListener(new checkmouse()); add(but1); add(but2); add(but3); but1.addActionListener(this); but2.addActionListener(this); but3.addActionListener(this); //列出目錄下的檔案 //File dlist=new File("C:\" ); //File dlist=new File("C:/" ); //File dlist=new File("http://ana.vexp.idv.tw/~hsiao/" ); File dlist; File content[]; if (flg==1) { dlist=new File("C:/" ); content=dlist.listFiles(); } else { try{ dlist=new File(this.getDocumentBase().toString()); content=dlist.listFiles(); } catch(Exception e1) //如果沒有讀到 {System.out.println(e1); return; } } int cn1dn=1; for(int i=0;ib) { relock(); //File abc=new File(filename+"/lock.txt"); int abcd=lock(); ln= 0; } else { ln= 1; } } } } else { FileWriter fw=new FileWriter(filename+"/lock.txt"); //寫檔 long n1=System.currentTimeMillis(); String n2=Long.toString(n1); fw.write(n2); fw.close(); File aFile = new File(filename+"/info.txt"); inFile = null; inFile = new RandomAccessFile(aFile,"rw"); FileChannel inChannel = inFile.getChannel(); inLock = inChannel.tryLock(); if(inLock!=null) { System.out.println("file locking"); ln =0; } } } catch (IOException e) { e.printStackTrace(System.err); System.exit(1); } return ln; } public void relock() { try { inLock.release(); inFile.close(); } catch (IOException e) { } System.out.println("Released file lock."); } public void itemStateChanged(ItemEvent e) { //System.out.println(cbox1.getSelectedItem());//看看選到哪個 filename=(String)cbox1.getSelectedItem(); //讀文字檔 try { FileReader fr=new FileReader((String)cbox1.getSelectedItem()+"/info.txt"); BufferedReader bf=new BufferedReader(fr); StringTokenizer stk=null; String line=null; if((line=bf.readLine())!=null) { stk=new StringTokenizer(line,","); txta.setText(stk.nextToken()); txtb.setText(stk.nextToken()); } } catch (IOException ae) { } } public void actionPerformed(ActionEvent e) //按鈕事件的處理方法 { JButton btn=(JButton) e.getSource(); if(btn==but1) { orgset(); } if(btn==but2) { combine(); } if(btn==but3) { t(); } } public void t()//小圖 { //filename=txt1.getText(); //取得編號 a=Integer.parseInt(txta.getText()); //取得列 b=Integer.parseInt(txtb.getText()); //取得行 pic=new Image[a][b]; if(flg==0) { img=getImage(getDocumentBase(),filename+"/cut/"+"img_1_1.jpg"); } else { img=Toolkit.getDefaultToolkit().createImage(filename+"/cut/"+"img_1_1.jpg"); } tracker = new MediaTracker(this); tracker.addImage(img,1); try { tracker.waitForAll(); } catch (InterruptedException e){ } tracker.removeImage(img,1); W =(int)(img.getWidth(this)*ratio); //取得圖片的寬 H =(int)(img.getHeight(this)*ratio); //取得圖片的高 ImageIcon icon; for(int i=0; iy) { grab_left(i,j); grab_right(i,j-1); up_down(i,j,1); } else if(i>x && j==y) { grab_up(i,j); grab_down(i-1,j); left_right(i,j,1); } else if(i>x && j>y) { grab_left(i,j); grab_right(i,j-1); grab_up(i,j); grab_down(i-1,j); all(i,j,1); } } } ////////////////由中往左 for(int i=x;i=0;j--) { if(i==x && jx && j8 && y<9) { if(flg==0) { img=getImage(getDocumentBase(),filename+"/"+"0"+(y+1)+(x+1)+".jpg"); } else { img=Toolkit.getDefaultToolkit().createImage(filename+"/"+"0"+(y+1)+(x+1)+".jpg"); } } else if(x<9 && y>8) { if(flg==0) { img=getImage(getDocumentBase(),filename+"/"+(y+1)+"0"+(x+1)+".jpg"); } else { img=Toolkit.getDefaultToolkit().createImage(filename+"/"+(y+1)+"0"+(x+1)+".jpg"); } } else if(x>8 && y>8) { if(flg==0) { img=getImage(getDocumentBase(),filename+"/"+(y+1)+(x+1)+".jpg"); } else { img=Toolkit.getDefaultToolkit().createImage(filename+"/"+(y+1)+(x+1)+".jpg"); } } } //取圖片左邊的pixels public void grab_left(int x,int y) { aaa(x,y); getp(img); for (int i=0;i>16); leftpic[1][j][i]=0xff & (p>>8); leftpic[2][j][i]=0xff & (p); } } } //取圖片右邊的pixels public void grab_right(int x,int y) { aaa(x,y); getp(img); int k=0; for (int i=W-m;i>16); rightpic[1][j][k]=0xff & (p>>8); rightpic[2][j][k]=0xff & (p); } k++; } } //取圖片上面的pixels public void grab_up(int x,int y) { aaa(x,y); getp(img); for (int i=0;i>16); uppic[1][j][i]=0xff & (p>>8); uppic[2][j][i]=0xff & (p); } } } //取圖片下面的pixels public void grab_down(int x,int y) { aaa(x,y); getp(img); for (int i=0;i>16); downpic[1][L][i]=0xff & (p>>8); downpic[2][L][i]=0xff & (p); L++; } } } //上下陣列做平均 static int[][] ud_avg(int[][] avg,int X) { for(int i=0;i>16); int picg=0xff & (p>>8); int picb=0xff & (p); temp[i*tempW*H+y*tempW+(x+j*W)]=(0xff000000|picr<<16|picg<<8|picb);//放入暫存矩陣 } } } } //平滑 System.out.println("開始平滑"); for(int i=0;i=1) { for(int y=0;y=tempH-1) { range=1; r=-1; } else { range=2; r=-1; } for(int count=r;count>16); picg=0xff & (p>>8); picb=0xff & (p); dx++; sumr=sumr+picr; sumg=sumg+picg; sumb=sumb+picb; } } picr=sumr/(3*range_count); picg=sumg/(3*range_count); picb=sumb/(3*range_count); dw++; temp[y*tempW+dw]=(0xff000000|picr<<16|picg<<8|picb);//放入暫存矩陣 } } } //////////// if(i>=1 && j==0) { for(int y=0;y=tempW-1) { range=1; r=-1; } else { range=2; r=-1; } int dy=y; for(int count=r;count>16); picg=0xff & (p>>8); picb=0xff & (p); dx++; sumr=sumr+picr; sumg=sumg+picg; sumb=sumb+picb; } } picr=sumr/(3*range_count); picg=sumg/(3*range_count); picb=sumb/(3*range_count); dw++; temp[dw*tempW+y]=(0xff000000|picr<<16|picg<<8|picb);//放入暫存矩陣 } } } } } System.out.println("寫檔開始"); BufferedImage buf1 = new BufferedImage(tempW,tempH,BufferedImage.TYPE_INT_RGB); buf1.setRGB(0,0,tempW,tempH,temp,0,tempW); FileOutputStream fileOut; File file = new File(filename+"/"+filename+".jpg"); try { //將檔案存成JPEG格式 fileOut = new FileOutputStream(file); JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fileOut); jpeg.encode(buf1); fileOut.close(); } catch (Exception e) { e.printStackTrace(); } System.out.println("寫檔OK!!"); long end=System.currentTimeMillis(); } public void cutpic() { int cutW=2064; int cutH=1554; int cut[]=new int[cutW * cutH]; int pixels[]=new int[W*H]; int X=(W-cutW)/2; int Y=(H-cutH)/2; System.out.println("切圖開始"); for(int i=0; iX) { if((pcx[i][j]-X)>(X/2)) { sw=pcx[i][j]-X; } else { sw=pcx[i][j]-(pcx[i][j]-X); } } else { sw=pcx[i][j]-(pcx[i][j]-X); } ew=sw+cutW; } if(i==0 && j>startY)//右 { sh=Y+pcy[i][j]; eh=sh+cutH; if(pcx[i][j]>X) { if((pcx[i][j]-X)>(X/2)) { sw=pcx[i][j]-X; } else { sw=X; //sw=pcx[i][j]-(pcx[i][j]-X); } } else { sw=X; //sw=pcx[i][j]-(pcx[i][j]-X); } ew=sw+cutW; } if(i>0 && jX) { if((pcx[i][j]-X)>(400)) { sw=pcx[i][j]-X; } else { //sw=pcx[i][j]-(pcx[i][j]-X); sw=X; } } else { //sw=pcx[i][j]; //sw=pcx[i][j]-(pcx[i][j]-X); sw=X; } ew=sw+cutW; } else { sh=pcy[i][j]-(pcy[i][j]-Y); eh=sh+cutH; sw=X+pcx[i][j]; ew=sw+cutW; } } if(i>0 && j>startY)//右下 { if(pcy[i][j]X) { //sw=X-((pcx[i][j]-X)-X); if((pcx[i][j]-X)>(400)) { sw=pcx[i][j]-X; } else { sw=pcx[i][j]-(pcx[i][j]-X); } } else { sw=X; } ew=sw+cutW; } else { sh=pcy[i][j]-(pcy[i][j]-Y); eh=sh+cutH; sw=X+pcx[i][j]; ew=sw+cutW; } } if(i>0 && j==startY)//下 { sh=pcy[i][j]-(pcy[i][j]-Y); eh=sh+cutH; sw=X+pcx[i][j]; ew=sw+cutW; } int tx,ty=0; for (int y=sh;y>16); int picg=0xff & (p>>8); int picb=0xff & (p); cut[ty*cutW+tx]=(0xff000000|picr<<16|picg<<8|picb);//放入暫存矩陣 tx++; } ty++; } BufferedImage buf1 = new BufferedImage(cutW,cutH,BufferedImage.TYPE_INT_RGB); buf1.setRGB(0,0,cutW,cutH,cut,0,cutW); FileOutputStream fileOut; File file = new File(filename+"/cut/"+"img_"+(i+1)+"_"+(j+1)+".jpg"); try { //將檔案存成JPEG格式 fileOut = new FileOutputStream(file); JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fileOut); jpeg.encode(buf1); fileOut.close(); } catch (Exception e) { e.printStackTrace(); } } } System.out.println("切圖OK!!"); } //放大與縮小 public void stateChanged(ChangeEvent e1) { int i; ratio=(zoom.getValue())/100.0;//設定比例 i=(int)(ratio*100.0); zo.setText(i+"%"); repaint(); } //以下show 圖 public void paint(Graphics g) { super.paint(g); for(int i=0; iposX) && (xaposY) && (yaposX) && (xaposY) && (ya