<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-179  評論-666  文章-29  trackbacks-0
    Java是一種面向對象的編程語言。它具有與平臺無關、面向對象、動態、安全等特點,允許直接使用多線程方式進行編程,對程序進行并發控制。Java還支持分布式網絡操作,從而能夠方便地進行網絡文件對象的存取。利用Java語言本身提供的繪圖功能,可以繪制一些簡單的圖形。而對于復雜圖形,一般先用繪圖軟件制成圖像,然后采用Java所提供的方法對圖像下載并進行處理和控制,從而實現靜態圖像的動態顯示。

      1 Java圖像處理與線程的并發控制

      1.1 Java圖像處理

      Java語言提供了豐富的類(Class)、接口(Interface)以及相應的調用方法(Method)。使用這些類或接口,可以定義自己的類或子類,充分利用Java面向對象的特性進行編程。在java.awt包中,提供了專門的Image類,它是1種抽象類,可提供抽象的方法描繪圖片的一些共同特性。而在Applet類和Tookit類中都提供了2種getImage()方法下載圖像,分別根據絕對地址和相對地址查詢所要下載的圖像。通常采用相對地址的下載方法,它的語法定義及功能如下:

      1.public Image getImage(URL url,String name)

      功能:根據相對地址下載圖像。

      參數:url??URL(統一資源定位)基地址, name 圖像文件名。

      獲取圖像后就可以調用Graphics類提供的drawImage()方法顯示圖像。

      2.public drawImage(Image img,int x,int y,observer)

      功能:在指定位置顯示圖像。

      參數:img 待顯示圖像,x 橫坐標,y 縱坐標,observer 圖像監視器,用來監視圖像的下載情況,接受圖像裝載信息(當圖像完全載入時返回True,否則返回False)。

      在顯示圖像時,通常希望獲得對圖像的控制,從而以自己喜歡的各種方式實現媒體播放。為此,Java專門提供了用于跟蹤包括圖像和聲音等多媒體對象的ImageObserver類和MediaTracker類,在本文程序中主要用到的是跟蹤多幅圖像狀態的MediaTracker類。

      1.2 Java多線程并發功能

      目前,線程(Thread)已經為許多操作系統和應用開發系統所采用。線程是程序的單個控制流,具有順序程序的特點,但是線程不是1個程序,它僅僅是程序的1個執行序列。線程具有很強的并發功能,在同一時刻可能有多個線程同時處于執行狀態。線程是動態的,具有一定的生命周期,分別經歷從創建、執行、阻塞直到消亡的過程。Java語言中提供了專門的Thread類,以支持直接的多線程編程。Thread類提供了對線程的控制方法,如Start(),Stop(),Run()、Suspend()、resume()、Sleep()以及Run()方法等等,它們可以對線程的狀態進行控制。并可以運用SetPriority()方法設置線程的運行優先順序。Thread類的定義方法如下:

      Thread(ThreadGroup group,Runable target,String name)

      SetPriority()用來設置線程的優先級。線程優先級是1個介于MINPRIORITY(在類中定義為1)和MAXPRIORITY(在類中定義為10)之間的整數。線程不同的優先級決定了不同線程之間的切換。

    2 Java圖像分割與合成的算法及實現

      Java程序首先將一個完整的圖像下載,然后將其分割成20個單元拼圖,即分為5行4列。在本例中特地將第20幅圖像單元設為1個空白圖像,以便拼圖時用戶交互操作使用。這些參數分別定義在相應的變量中。

      final int XCELLS=5;  //每行拼圖的數目
      final int YCELLS=4;//每列拼圖的數目
      final int ALLCELLS=20;//分割元素的數目
      final int EMPTY=19;//將第20單元,即cells[19]置成
      //空白圖像

      然后將這些圖像分割單元存于1個Cell類數組cells[]中,在這里Cell類中含有圖像以及它的起始位置和當前位置,其具體定義如下:

      class Cell
      {int sx,sy; //起始位置
      int cx,cy; //當前位置
      Image img; //單元圖像
      public Cell(Image img,int x,int y) //Cell類構造函數
      {this.img=img;
      sx=x;sy=y;} //給起始位置賦值為x,y
      }

      為了對每個圖像分割單元進行狀態跟蹤,還需要建立1個MediaTracker類的實體(instance),然后調用addImage()方法,為每個要跟蹤的圖像指定1個唯一的標識符。標識符決定了圖像獲取時的優先順序并使得圖像能夠獨立完整地進行處理。

      MediaTracker tracker=new MediaTracker(this)
      //為當前使用類建立1個MediaTracker實體,用于跟蹤類
      //上的圖像
      cells[EMPTY]=new Cell(createEmpty(),toPoint(EMPTY).x,toPoint(EMPTY).y);
      tracker.addImage(cells[EMPTY].img,0);
      //調用createEmpty()方法產生空白圖像,并加入到所跟蹤
      //的cells數組中20單元
      void setPosition(int x,int y)  //設置單元圖像當前位置
      {cx=x;cy=y;}

      各個圖像單元的位置存放于位置數組position里:

      int position[][]=new int[XCELLs][YCELLS]

      這樣就可以使用Cell類數組cells[]對圖像的各個單元進行操作,從而將各個單元圖像進行合成顯示,并通過position[][]數組改變各個單元的位置。為了對各單元進行并發操作,需要對線程加以控制,并通過鼠標事件和按鍵事件控制進程的開始、睡眠和進行等狀態變化,其實現方法如下(僅以run()方法為例):

      Thread imageThread=null; //定義線程imageThread,初始
    //值為空
      public void run()
      {imageThread.setPriority(Thread.MINPRIORITY);//設置線
    //程執行優先級別

      try
        {imageThread.sleep(2000);//線程睡眠等待2000ms
        }catch(InterruptedException e){}
      first=changeArray();//調用changeArray()方法隨機改變圖
    //像單元位置
      while(!loaded)//判斷圖像若未被跟蹤載入,則調用相關
    //方法跟蹤并加載圖像
        {repaint();
        try
         {imageThread.sleep(100);
         }catch(InterruptedException e){System.out.println(e);}
        }
      }

      changeArray()方法用來隨機地改變圖像單元的位置,其實現方法如下:

      boolean changeArray()
      {
      int source[]=new int[20];
      int full[]=new int[20];
      for(int i=0;i<ALLCELLS;i++)
        {
        int r=(int)(Math.random()*20);
        while(full[r]!=0)
        r=(r+(int)(Math.random()*20))%20;
        source[i]=r;
        full[r]=1;
        }
      int pos=0;
      for(int i=0;i<ALLCELLS;i++,pos++)
        {
        Point p=toPoint(source[pos]);
        cells[pos].setPosition(p.x,p.y);
        position[p.x][p.y]=pos;
        }
      x=cells[EMPTY].cx;
      y=cells[EMPTY].cy;
      return(false);
      }

      當applet執行后點擊鼠標,線程就被啟動,開始裝載圖像并執行changeArray()隨機選擇1個位置來移動圖像單元,此時可以使用鍵盤移動圖像上的任意單元到任何位置。在這里還有一個重要內容就是怎樣將圖像分割成許多的單元,我們可以通過引用CropImageFilter方法來分割圖像,它是1個分割圖像過濾器。其實現方法如下:

      Image crop(int pos)
      {//pos參數為調用函數給出的圖像單元位置號
      Point p=toPoint(pos);//將位置號轉化為坐標形式
      ImageFilter filter=new CropImageFilter(xside*p.x,yside*p.y,xside,yside);
      //在給定坐標和長寬的絕對矩形區域內創建分割圖像過
      //濾器實體filter
      ImageProducer producer=new FilteredImageSource(baseImage.getSource(),filter;)

      //由原圖像和分割圖像過濾器實體創建新的圖像

      //產生器producer
      return createImage(producer);//由圖像產生器producer產生
    //圖像并返回
      }

      通過以上步驟,整個圖像的分割與合成顯示就完成了。本程序主要利用了crop()、changeArray()、mousedown()、Thread()等方法以及幾個表示程序運行狀態的布爾變量實現了一個線程控制和動感圖像相結合的圖像處理過程。

    posted on 2007-08-20 10:51 Alpha 閱讀(1696) 評論(0)  編輯  收藏 所屬分類: Java J2EE JSP
    主站蜘蛛池模板: 亚洲日韩v无码中文字幕| 美国毛片亚洲社区在线观看| 狠狠久久永久免费观看| 久久一本岛在免费线观看2020| 黄色三级三级三级免费看| 亚洲国产美女精品久久| 国产av无码专区亚洲av桃花庵| 免费一级毛片在线观看| 国产在线国偷精品产拍免费| 久久久亚洲精品无码| 亚洲AV网站在线观看| 一级毛片在线免费播放| 亚洲youwu永久无码精品| 亚洲宅男天堂a在线| 久久精品蜜芽亚洲国产AV| 亚洲国产三级在线观看| 久久精品亚洲乱码伦伦中文| 国产人成免费视频| 中文字幕在线免费观看视频| 曰批免费视频播放免费| 国产91成人精品亚洲精品| 亚洲va久久久噜噜噜久久天堂| 狠狠色婷婷狠狠狠亚洲综合| 亚洲成人影院在线观看| 免费一级毛片不卡不收费| 日本a级片免费看| 一级做a爰片久久毛片免费陪 | 亚洲午夜精品国产电影在线观看| 久久99国产亚洲精品观看| 国产亚洲3p无码一区二区| 亚洲精品乱码久久久久久自慰 | 一级中文字幕免费乱码专区| 香港一级毛片免费看| 国产偷国产偷亚洲高清人| 午夜亚洲乱码伦小说区69堂| 国产99久久亚洲综合精品| 午夜免费国产体验区免费的 | 亚洲成年人啊啊aa在线观看| 亚洲国产成人精品无码久久久久久综合| 免费国产在线观看不卡| 亚洲人成电影网站国产精品|