千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0

          剛才把截屏程序放出去之后,收到了朋友BeanSoft 的建議,剛來這里就能認識他,很高興,現在又改進了一下,改進的地方如下

          1,修復了選擇選區后,再改變大小時,當把右側的邊框拖過左側或者左側的邊框拖到右側或者上面的邊框拖過下面,只會顯示一條邊框的BUG.
          2,在沒有截屏的時候,會有一條提示的字符串跟著鼠標走.
          3,在點了截屏之后,主窗口會先隱藏起來,截完圖后才會彈出來
          4,去掉了截屏時的自定義鼠標顯示,因為這樣的話,源代碼編譯之后,運行會出問題,因為別人的電腦上沒有我那個鼠標的圖片.
          5,增加了可保存的圖片格式,現在可保存(JPG,GIF,PNG,BMP)格式

          源代碼附上,可以直接自己編譯,打成JAR包.我這里也提供一下可執行JAR包的下載.


          點擊下載可執行的JAR包
          /*
           * CaptureScreen.java
           *
           * Created on 2007年8月30日, 下午12:46
           *
           * To change this template, choose Tools | Template Manager
           * and open the template in the editor.
           
          */


          package hadeslee.swing;

          /**
           *
           * 
          @author lbf
           
          */

          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;
          import java.io.*;
          import javax.imageio.*;
          import java.awt.image.*;
          public class CaptureScreen extends JFrame implements ActionListener{
              
          private JButton start,cancel,save;
              
          private JPanel c;
              
          private BufferedImage get;
              
          /** Creates a new instance of CaptureScreen */
              
          public CaptureScreen() {
                  
          super("屏幕截取軟件(第二版)");
                  initWindow();
              }

              
          private void initWindow(){
                  start
          =new JButton("開始截取");
                  cancel
          =new JButton("退出");
                  save
          =new JButton("保存");
                  save.setEnabled(
          false);
                  save.addActionListener(
          this);
                  start.addActionListener(
          this);
                  cancel.addActionListener(
          this);
                  JPanel buttonJP
          =new JPanel();
                  c
          =new JPanel(new BorderLayout());
                  JLabel jl
          =new JLabel("屏幕截取",JLabel.CENTER);
                  JLabel jl1
          =new JLabel("作者:千里冰封",JLabel.CENTER);
                  jl.setFont(
          new Font("黑體",Font.BOLD,40));
                  jl1.setFont(
          new Font("宋體",Font.BOLD,20));
                  jl.setForeground(Color.RED);
                  jl1.setForeground(Color.BLUE);
                  c.add(jl,BorderLayout.CENTER);
                  c.add(jl1,BorderLayout.SOUTH);
                  buttonJP.add(start);
                  buttonJP.add(save);
                  buttonJP.add(cancel);
                  
          this.getContentPane().add(c,BorderLayout.CENTER);
                  
          this.getContentPane().add(buttonJP,BorderLayout.SOUTH);
                  
          this.setSize(300,300);
                  
          this.setLocationRelativeTo(null);
                  
          this.setVisible(true);
                  
          this.setAlwaysOnTop(true);
                  
          this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              }

              
          private void updates(){
                  
          this.setVisible(true);
                  
          if(get!=null){
                      save.setEnabled(
          true);
                      ImageIcon ii
          =new ImageIcon(get);
                      JLabel jl
          =new JLabel(ii);
                      c.removeAll();
                      c.add(
          new JScrollPane(jl),BorderLayout.CENTER);
                      SwingUtilities.updateComponentTreeUI(
          this);
                  }

              }

              
          private void doStart(){
                  
          try{
                      
          this.setVisible(false);
                      Thread.sleep(
          500);//睡500毫秒是為了讓主窗完全不見
                      Robot ro=new Robot();
                      Toolkit tk
          =Toolkit.getDefaultToolkit();
                      Dimension di
          =tk.getScreenSize();
                      Rectangle rec
          =new Rectangle(0,0,di.width,di.height);
                      BufferedImage bi
          =ro.createScreenCapture(rec);
                      JFrame jf
          =new JFrame();
                      Temp temp
          =new Temp(jf,bi,di.width,di.height);
                      jf.getContentPane().add(temp,BorderLayout.CENTER);
                      jf.setUndecorated(
          true);
                      jf.setSize(di);
                      jf.setVisible(
          true);
                      jf.setAlwaysOnTop(
          true);
                  }
           catch(Exception exe){
                      exe.printStackTrace();
                  }

              }
           
              
          private void doSave(){
                  
          try{
                      JFileChooser jfc
          =new JFileChooser(".");
                      jfc.addChoosableFileFilter(
          new JPGfilter());
                      jfc.addChoosableFileFilter(
          new PNGfilter());
                      jfc.addChoosableFileFilter(
          new GIFfilter());
                      jfc.addChoosableFileFilter(
          new BMPfilter());
                      
          int i=jfc.showSaveDialog(this);
                      
          if(i==JFileChooser.APPROVE_OPTION){
                          File file
          =jfc.getSelectedFile();
                          String about
          ="PNG";
                          String ext
          =file.toString().toLowerCase();
                          javax.swing.filechooser.FileFilter ff
          =jfc.getFileFilter();
                          
          if(ff instanceof JPGfilter){
                              
          if(!ext.endsWith(".jpg")){
                                  String ns
          =ext+".jpg";
                                  file
          =new File(ns);
                                  about
          ="JPG";
                              }

                          }
           else if(ff instanceof PNGfilter){
                              
          if(!ext.endsWith(".png")){
                                  String ns
          =ext+".png";
                                  file
          =new File(ns);
                                  about
          ="PNG";
                              }

                          }
          else if(ff instanceof BMPfilter){
                              
          if(!ext.endsWith(".bmp")){
                                  String ns
          =ext+".bmp";
                                  file
          =new File(ns);
                                  about
          ="BMP";
                              }

                          }
          else if(ff instanceof GIFfilter){
                              
          if(!ext.endsWith(".gif")){
                                  String ns
          =ext+".gif";
                                  file
          =new File(ns);
                                  about
          ="GIF";
                              }

                          }

                          
          if(ImageIO.write(get,about,file)){
                              JOptionPane.showMessageDialog(
          this,"保存成功!");
                          }
           else
                              JOptionPane.showMessageDialog(
          this,"保存失?。?/span>");
                      }

                  }
           catch(Exception exe){
                      exe.printStackTrace();
                  }

              }

              
          public void actionPerformed(ActionEvent ae){
                  
          if(ae.getSource()==start){
                      doStart();
                  }
           else if(ae.getSource()==cancel){
                      System.exit(
          0);
                  }
           else if(ae.getSource()==save){
                      doSave();
                  }

              }

              
          //保存BMP格式的過濾器
              private class BMPfilter extends javax.swing.filechooser.FileFilter{
                  
          public BMPfilter(){
                      
                  }

                  
          public boolean accept(File file){
                      
          if(file.toString().toLowerCase().endsWith(".bmp")||
                              file.isDirectory())
          {
                          
          return true;
                      }
           else
                          
          return false;
                  }

                  
          public String getDescription(){
                      
          return "*.BMP(BMP圖像)";
                  }

              }

              
          //保存JPG格式的過濾器
              private class JPGfilter extends javax.swing.filechooser.FileFilter{
                  
          public JPGfilter(){
                      
                  }

                  
          public boolean accept(File file){
                      
          if(file.toString().toLowerCase().endsWith(".jpg")||
                              file.toString().toLowerCase().endsWith(
          ".jpeg")||
                              file.isDirectory())
          {
                          
          return true;
                      }
           else
                          
          return false;
                  }

                  
          public String getDescription(){
                      
          return "*.JPG,*.JPEG(JPG,JPEG圖像)";
                  }

              }

              
          //保存GIF格式的過濾器
              private class GIFfilter extends javax.swing.filechooser.FileFilter{
                  
          public GIFfilter(){
                      
                  }

                  
          public boolean accept(File file){
                      
          if(file.toString().toLowerCase().endsWith(".gif")||
                              file.isDirectory())
          {
                          
          return true;
                      }
           else
                          
          return false;
                  }

                  
          public String getDescription(){
                      
          return "*.GIF(GIF圖像)";
                  }

              }

              
              
          //保存PNG格式的過濾器
              private class PNGfilter extends javax.swing.filechooser.FileFilter{
                  
          public boolean accept(File file){
                      
          if(file.toString().toLowerCase().endsWith(".png")||
                              file.isDirectory())
          {
                          
          return true;
                      }
           else
                          
          return false;
                  }

                  
          public String getDescription(){
                      
          return "*.PNG(PNG圖像)";
                  }

              }

              
          //一個暫時類,用于顯示當前的屏幕圖像
              private class Temp extends JPanel implements MouseListener,MouseMotionListener{
                  
          private BufferedImage bi;
                  
          private int width,height;
                  
          private int startX,startY,endX,endY,tempX,tempY;
                  
          private JFrame jf;
                  
          private Rectangle select=new Rectangle(0,0,0,0);//表示選中的區域
                  private Cursor cs=new Cursor(Cursor.CROSSHAIR_CURSOR);//表示一般情況下的鼠標狀態
                  private States current=States.DEFAULT;// 表示當前的編輯狀態
                  private Rectangle[] rec;//表示八個編輯點的區域
                  
          //下面四個常量,分別表示誰是被選中的那條線上的端點
                  public static final int START_X=1;
                  
          public static final int START_Y=2;
                  
          public static final int END_X=3;
                  
          public static final int END_Y=4;
                  
          private int currentX,currentY;//當前被選中的X和Y,只有這兩個需要改變
                  private Point p=new Point();//當前鼠標移的地點
                  private boolean showTip=true;//是否顯示提示.如果鼠標左鍵一按,則提示不再顯了
                  public Temp(JFrame jf,BufferedImage bi,int width,int height){
                      
          this.jf=jf;
                      
          this.bi=bi;
                      
          this.width=width;
                      
          this.height=height;
                      
          this.addMouseListener(this);
                      
          this.addMouseMotionListener(this);
                      initRecs();
                  }

                  
          private void initRecs(){
                      rec
          =new Rectangle[8];
                      
          for(int i=0;i<rec.length;i++){
                          rec[i]
          =new Rectangle();
                      }

                  }

                  
          public void paintComponent(Graphics g){
                      g.drawImage(bi,
          0,0,width,height,this);
                      g.setColor(Color.RED);
                      g.drawLine(startX,startY,endX,startY);
                      g.drawLine(startX,endY,endX,endY);
                      g.drawLine(startX,startY,startX,endY);
                      g.drawLine(endX,startY,endX,endY);
                      
          int x=startX<endX?startX:endX;
                      
          int y=startY<endY?startY:endY;
                      select
          =new Rectangle(x,y,Math.abs(endX-startX),Math.abs(endY-startY));
                      
          int x1=(startX+endX)/2;
                      
          int y1=(startY+endY)/2;
                      g.fillRect(x1
          -2,startY-2,5,5);
                      g.fillRect(x1
          -2,endY-2,5,5);
                      g.fillRect(startX
          -2,y1-2,5,5);
                      g.fillRect(endX
          -2,y1-2,5,5);
                      g.fillRect(startX
          -2,startY-2,5,5);
                      g.fillRect(startX
          -2,endY-2,5,5);
                      g.fillRect(endX
          -2,startY-2,5,5);
                      g.fillRect(endX
          -2,endY-2,5,5);
                      rec[
          0]=new Rectangle(x-5,y-5,10,10);
                      rec[
          1]=new Rectangle(x1-5,y-5,10,10);
                      rec[
          2]=new Rectangle((startX>endX?startX:endX)-5,y-5,10,10);
                      rec[
          3]=new Rectangle((startX>endX?startX:endX)-5,y1-5,10,10);
                      rec[
          4]=new Rectangle((startX>endX?startX:endX)-5,(startY>endY?startY:endY)-5,10,10);
                      rec[
          5]=new Rectangle(x1-5,(startY>endY?startY:endY)-5,10,10);
                      rec[
          6]=new Rectangle(x-5,(startY>endY?startY:endY)-5,10,10);
                      rec[
          7]=new Rectangle(x-5,y1-5,10,10);
                      
          if(showTip){
                          g.setColor(Color.CYAN);
                          g.fillRect(p.x,p.y,
          170,20);
                          g.setColor(Color.RED);
                          g.drawRect(p.x,p.y,
          170,20);
                          g.setColor(Color.BLACK);
                          g.drawString(
          "請按住鼠標左鍵不放選擇截圖區",p.x,p.y+15);
                      }

                  }

                  
          //根據東南西北等八個方向決定選中的要修改的X和Y的座標
                  private void initSelect(States state){
                      
          switch(state){
                          
          case DEFAULT:
                              currentX
          =0;
                              currentY
          =0;
                              
          break;
                          
          case EAST:
                              currentX
          =(endX>startX?END_X:START_X);
                              currentY
          =0;
                              
          break;
                          
          case WEST:
                              currentX
          =(endX>startX?START_X:END_X);
                              currentY
          =0;
                              
          break;
                          
          case NORTH:
                              currentX
          =0;
                              currentY
          =(startY>endY?END_Y:START_Y);
                              
          break;
                          
          case SOUTH:
                              currentX
          =0;
                              currentY
          =(startY>endY?START_Y:END_Y);
                              
          break;
                          
          case NORTH_EAST:
                              currentY
          =(startY>endY?END_Y:START_Y);
                              currentX
          =(endX>startX?END_X:START_X);
                              
          break;
                          
          case NORTH_WEST:
                              currentY
          =(startY>endY?END_Y:START_Y);
                              currentX
          =(endX>startX?START_X:END_X);
                              
          break;
                          
          case SOUTH_EAST:
                              currentY
          =(startY>endY?START_Y:END_Y);
                              currentX
          =(endX>startX?END_X:START_X);
                              
          break;
                          
          case SOUTH_WEST:
                              currentY
          =(startY>endY?START_Y:END_Y);
                              currentX
          =(endX>startX?START_X:END_X);
                              
          break;
                          
          default:
                              currentX
          =0;
                              currentY
          =0;
                              
          break;
                      }

                  }

                  
          public void mouseMoved(MouseEvent me){
                      doMouseMoved(me);
                      initSelect(current);
                      
          if(showTip){
                          p
          =me.getPoint();
                          repaint();
                      }

                  }

                  
          //特意定義一個方法處理鼠標移動,是為了每次都能初始化一下所要選擇的地區
                  private void doMouseMoved(MouseEvent me){
                      
          if(select.contains(me.getPoint())){
                          
          this.setCursor(new Cursor(Cursor.MOVE_CURSOR));
                          current
          =States.MOVE;
                      }
           else{
                          States[] st
          =States.values();
                          
          for(int i=0;i<rec.length;i++){
                              
          if(rec[i].contains(me.getPoint())){
                                  current
          =st[i];
                                  
          this.setCursor(st[i].getCursor());
                                  
          return;
                              }

                          }

                          
          this.setCursor(cs);
                          current
          =States.DEFAULT;
                      }

                  }

                  
          public void mouseExited(MouseEvent me){
                      
                  }

                  
          public void mouseEntered(MouseEvent me){
                      
                  }

                  
          public void mouseDragged(MouseEvent me){
                      
          int x=me.getX();
                      
          int y=me.getY();
                      
          if(current==States.MOVE){
                          startX
          +=(x-tempX);
                          startY
          +=(y-tempY);
                          endX
          +=(x-tempX);
                          endY
          +=(y-tempY);
                          tempX
          =x;
                          tempY
          =y;
                      }
          else if(current==States.EAST||current==States.WEST){
                          
          if(currentX==START_X){
                              startX
          +=(x-tempX);
                              tempX
          =x;
                          }
          else{
                              endX
          +=(x-tempX);
                              tempX
          =x;
                          }

                      }
          else if(current==States.NORTH||current==States.SOUTH){
                          
          if(currentY==START_Y){
                              startY
          +=(y-tempY);
                              tempY
          =y;
                          }
          else{
                              endY
          +=(y-tempY);
                              tempY
          =y;
                          }

                      }
          else if(current==States.NORTH_EAST||current==States.NORTH_EAST||
                              current
          ==States.SOUTH_EAST||current==States.SOUTH_WEST){
                          
          if(currentY==START_Y){
                              startY
          +=(y-tempY);
                              tempY
          =y;
                          }
          else{
                              endY
          +=(y-tempY);
                              tempY
          =y;
                          }

                          
          if(currentX==START_X){
                              startX
          +=(x-tempX);
                              tempX
          =x;
                          }
          else{
                              endX
          +=(x-tempX);
                              tempX
          =x;
                          }

                          
                      }
          else{
                          startX
          =tempX;
                          startY
          =tempY;
                          endX
          =me.getX();
                          endY
          =me.getY();
                      }

                      
          this.repaint();
                  }

                  
          public void mousePressed(MouseEvent me){
                      showTip
          =false;
                      tempX
          =me.getX();
                      tempY
          =me.getY();
                  }

                  
          public void mouseReleased(MouseEvent me){
                      
          if(me.isPopupTrigger()){
                          
          if(current==States.MOVE){
                              showTip
          =true;
                              p
          =me.getPoint();
                              startX
          =0;
                              startY
          =0;
                              endX
          =0;
                              endY
          =0;
                              repaint();
                          }
           else{
                              jf.dispose();
                              updates();
                          }

                          
                      }

                  }

                  
          public void mouseClicked(MouseEvent me){
                      
          if(me.getClickCount()==2){
                          
          //Rectangle rec=new Rectangle(startX,startY,Math.abs(endX-startX),Math.abs(endY-startY));
                          Point p=me.getPoint();
                          
          if(select.contains(p)){
                              
          if(select.x+select.width<this.getWidth()&&select.y+select.height<this.getHeight()){
                                  get
          =bi.getSubimage(select.x,select.y,select.width,select.height);
                                  jf.dispose();
                                  save.setEnabled(
          true);
                                  updates();
                              }
          else{
                                  
          int wid=select.width,het=select.height;
                                  
          if(select.x+select.width>=this.getWidth()){
                                      wid
          =this.getWidth()-select.x;
                                  }

                                  
          if(select.y+select.height>=this.getHeight()){
                                      het
          =this.getHeight()-select.y;
                                  }

                                  get
          =bi.getSubimage(select.x,select.y,wid,het);
                                  jf.dispose();
                                  save.setEnabled(
          true);
                                  updates();
                              }

                              
                          }

                      }

                  }

              }

              
              
          public static void main(String args[]){
                  
          new CaptureScreen();
              }

          }

          enum States{
              NORTH_WEST(
          new Cursor(Cursor.NW_RESIZE_CURSOR)),//表示西北角
              NORTH(new Cursor(Cursor.N_RESIZE_CURSOR)),
              NORTH_EAST(
          new Cursor(Cursor.NE_RESIZE_CURSOR)),
              EAST(
          new Cursor(Cursor.E_RESIZE_CURSOR)),
              SOUTH_EAST(
          new Cursor(Cursor.SE_RESIZE_CURSOR)),
              SOUTH(
          new Cursor(Cursor.S_RESIZE_CURSOR)),
              SOUTH_WEST(
          new Cursor(Cursor.SW_RESIZE_CURSOR)),
              WEST(
          new Cursor(Cursor.W_RESIZE_CURSOR)),
              MOVE(
          new Cursor(Cursor.MOVE_CURSOR)),
              DEFAULT(
          new Cursor(Cursor.DEFAULT_CURSOR));
              
          private Cursor cs;
              States(Cursor cs)
          {
                  
          this.cs=cs;
              }

              
          public Cursor getCursor(){
                  
          return cs;
              }

          }




          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-08-30 14:40 千里冰封 閱讀(3443) 評論(14)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: JAVA截屏程序(第二版)
          2007-08-30 17:26 | JAVA面試題
          速度真快,崇拜中。。。。  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2007-08-30 17:30 | BeanSoft
          支持到死, 呵呵.  回復  更多評論
            
          # re: JAVA截屏程序(第二版)[未登錄]
          2007-08-30 18:25 | Samuel
          哈哈!不錯?。?!
          我上午剛發現的問題這么快就解決了。。

          優化了很多。
          佩服!

          1、希望增加拷貝剪切圖到剪貼板上去的功能,。這樣就可以直接拷貝word中。而不需要另存文件來考取。

          2、希望增加tabpanel來顯示每次截取的圖。并支持對選中的tabpanel中拷貝到剪貼板。。

          慢慢完善功能,一不小心就做一個成熟的軟件來。

          功能一定要小巧,不能過去龐大,否則就操作就不是很方便了。。  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2007-08-30 21:44 | Pande
          挺有意思的方法,可是能實現的抓取方式太有限了,要做強還得用native的API  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2007-08-30 23:09 | BeanSoft
          是呀, 上次有人用 SWT 做了個 Native 的, 可惜, 不帶源碼唉... 關于 Robot 類和截屏, 理論上可以做遠程控制了, 參考:
          http://gro.clinux.org/forum/forum.php?forum_id=2597

          Java 遠程控制 1.0 測試版發布  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2007-08-31 09:49 | Bruce
          public static void main(String args[]){
          new CaptureScreen();
          }
          }
          enum States{
          NORTH_WEST(new Cursor(Cursor.NW_RESIZE_CURSOR)),//表示西北角
          NORTH(new Cursor(Cursor.N_RESIZE_CURSOR)),
          NORTH_EAST(new Cursor(Cursor.NE_RESIZE_CURSOR)),
          EAST(new Cursor(Cursor.E_RESIZE_CURSOR)),
          SOUTH_EAST(new Cursor(Cursor.SE_RESIZE_CURSOR)),
          SOUTH(new Cursor(Cursor.S_RESIZE_CURSOR)),
          SOUTH_WEST(new Cursor(Cursor.SW_RESIZE_CURSOR)),
          WEST(new Cursor(Cursor.W_RESIZE_CURSOR)),
          MOVE(new Cursor(Cursor.MOVE_CURSOR)),
          DEFAULT(new Cursor(Cursor.DEFAULT_CURSOR));
          private Cursor cs;
          States(Cursor cs){
          this.cs=cs;
          }
          老大,我的這個在我這里編譯不通過。。。。是咱回事?  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2007-08-31 10:46 | 千里冰封
          @Bruce
          可能你那里用的JDK是低于1.5的

          這是枚舉,是JDK1.5新加的功能,你換JDK1.5或者以上的版本試一下吧.現在用JDK1.4的已經很少了  回復  更多評論
            
          # re: JAVA截屏程序(第二版)[未登錄]
          2007-08-31 11:11 | jerry
          private States current=States.DEFAULT;// 表示當前的編輯狀態

          這里執行的時候似乎有點問題,是什么原因?  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2007-08-31 11:13 | 千里冰封
          @jerry
          一開始的時候,是默認的狀態,這個枚舉就是列舉了一些鼠標的外觀樣式和當前鼠標的狀態.以確實是拖動還是畫圖還是改變大小等等操作  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2007-09-13 15:09 | jht
          # re: JAVA截屏程序(第二版)
          2008-04-25 16:22 | chw
          最好把 運行腳本也一塊打包,否則下了你的jar包后還得自己寫個bat來運行。  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2008-06-03 13:56 | wiloon
          老大,,!你好像只考慮了任務欄在屏幕下方的情況.  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2008-07-29 12:26 | stonebow
          我想問一下,如果對于視頻播放中畫面的獲得應該怎樣操作呢?謝謝  回復  更多評論
            
          # re: JAVA截屏程序(第二版)
          2012-07-03 11:58 | andyyu
          我想問一下,現在的這個程序只能截取屏幕內的圖像。如何進行桌面意外的部分的截屏。  回復  更多評論
            
          主站蜘蛛池模板: 湖南省| 内江市| 潮安县| 关岭| 化隆| 忻城县| 巍山| 崇仁县| 增城市| 定边县| 麻栗坡县| 黄陵县| 那坡县| 深圳市| 桦甸市| 西乡县| 定远县| 明星| 固原市| 九江县| 谷城县| 漳州市| 博乐市| 万载县| 安康市| 瓦房店市| 宾阳县| 康马县| 芮城县| 确山县| 泾川县| 任丘市| 德惠市| 玉环县| 丹阳市| 宁波市| 元氏县| 阜城县| 克拉玛依市| 宜城市| 大连市|