程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 圖片處理部分函數

圖片處理部分函數

編輯:J2ME
/**
   * <p>Title: 常用的一些圖片處理函數,包含MIDP1.0,NOKIA,MIDP2.0三個平台,希看大家開發時都采用這些函數來處理。
   *  請大家不要從一張大圖片裡截取小圖片並創立一張新的小圖片,那將造成在其他平台上不透明</p>
   * <p>Description: 下面這些函數重要處理從一張大圖片裡面截取一張小圖片,並對圖片進行鏡象翻轉以及旋轉。
   *    由於MIDP1.0不支撐鏡象和旋轉,我們采用了自己的方法來處理,只實現了鏡象翻轉,對於
   *    旋轉部分,由於自己處理的方法比擬低效,必需由美工將旋轉後的圖片做出來,直接畫。
   *   對於NOKIA和MIDP2.0,由於支撐這些把持,但實在現方法不雷同,因此下面對這些把持進行封裝,保證接口同一性,
   *   方便游戲的移植。
   *   由於NOKIA和MIDP在這些把持上對應的常量不同一,為了方便,我們自己定義了一組常量,在函數裡,我們做了相應的映射
   *   請大家應用時留心。這些常量的對應如下:
   *   把持   我們的定義  NOKIA    MIDP2.0
   *   直接裁減  0   0    0
   *   繞Y軸鏡象翻轉  0x2000   FLIP_HORIZONTAL(0x2000)  TRANS_MIRROR(7)
   *   繞X軸鏡象翻轉  0x4000   FLIP_VERTICAL(0x4000)  TRANS_MIRROR_ROT180(1)
   *   順時針旋轉90度  90   ROTATE_270(270)  TRANS_ROT90(5)
   *   順時針旋轉180度 180   ROTATE_180(180)  TRANS_ROT180(3)
   *   順時針旋轉270度 270   ROTATE_90(90)   TRANS_ROT270(6)
   *  
   *  大家在應用這些函數時,對應的把持常量均應用我們自己定義的常量。
   *</p>
   * <p>Copyright: Copyright (c) 2004</p>
   * <p>Company: Bbmf</p>
   * @author Beckham
   * @version 1.1
  */


  /**
   * 對單張圖片畫,支撐翻轉,用於MIDP1.0中
   * @param original Image 原始圖片
   * @param g Graphics
   * @param x int         
   * @param y int
   * @param mode int   模式0:直接畫  0x2000:繞Y軸鏡象翻轉 0x4000:繞X軸鏡象翻轉
   */

public void drawClipImageForMIDP1(Graphics g, int x ,int y,Image original ,int mode)
  {
      int oldWidth  = g.getClipWidth();
      int oldHeight = g.getClipHeight();

    int w = original.getWidth(), h = original.getHeight();
    if(mode == 0)
    {
      g.drawImage(original,x,y,0);
    }
    if(mode == 0x2000)//繞Y軸旋轉
    {
      for (int i = 0; i < w; i++) {
        g.setClip(x + i, y, 1, h);
        g.drawImage(original, x - w + i * 2 + 1, y, 0);
      }
    }
    else if(mode == 0x4000)//繞X軸旋轉
    {
      for (int i = 0; i < h; i++) {
       g.setClip(x , y+ i, w, 1);
       g.drawImage(original, x , y - h + i*2 + 1, 0);
     }
    }
    g.setClip(0, 0, oldWidth, oldHeight);
  }
 


  /**
   * drawClip 畫一個圖片的一部分,不支撐翻轉,用於MIDP1.0中
   *
   * @param g Graphics
   * @param x int 要畫的地位x
   * @param y int 要畫的地位y
   * @param image Image 圖片
   * @param clipX int clip在圖片中的坐標x
   * @param clipY int clip在圖片中的坐標y
   * @param clipWidth int clip在圖片中的寬度
   * @param clipHeight int clip在圖片中的高度
   */
  void drawClipImageForMIDP1(Graphics g, int x, int y, Image image, int clipX, int clipY, int clipWidth, int clipHeight) {
      int oldWidth  = g.getClipWidth();
      int oldHeight = g.getClipHeight();
      g.setClip(x, y, clipWidth, clipHeight);
      g.drawImage(image, x - clipX, y - clipY, 0);
      g.setClip(0, 0, oldWidth, oldHeight);
  }

  /**
   * drawClip 畫一個圖片的一部分,並支撐翻轉,用於MIDP1.0中
   *
   * @param g Graphics
   * @param x int 要畫的地位x
   * @param y int 要畫的地位y
   * @param image Image 圖片
   * @param clipX int clip在圖片中的坐標x
   * @param clipY int clip在圖片中的坐標y
   * @param clipWidth int clip在圖片中的寬度
   * @param clipHeight int clip在圖片中的高度
   * @param mode int 0:不做任何轉換 0x2000:繞Y軸鏡象翻轉 0x4000:繞X軸鏡象翻轉

*/
 void drawClipImageForMIDP1(Graphics g, int x, int y, Image image, intclipX, int clipY, int clipWidth, int clipHeight,int mode) {
      int oldWidth  = g.getClipWidth();
      int oldHeight = g.getClipHeight();
    if(mode == 0){//不作旋轉
      g.setClip(x, y, clipWidth, clipHeight);
      g.drawImage(image, x - clipX, y - clipY, 0);
    }
    else if(mode == 0x2000){//繞Y軸鏡象翻轉
      for(int i = 0 ; i < clipWidth; i++)
      {
        g.setClip(x + i, y, 1, clipHeight);
        g.drawImage(image, x + i - clipX - clipWidth + i + 1, y - clipY, 0);
      }
    }
    else if(mode == 0x4000){//繞X軸鏡象翻轉
      for(int i = 0 ; i < clipHeight; i++)
      {
        g.setClip(x , y+ i, clipWidth, 1);
        g.drawImage(image, x -clipX, y + i*2 - clipY - clipHeight + 1, 0);
      }
    }
    g.setClip(0, 0, oldWidth, oldHeight);   
  }


 /**
  * drawClip 畫一個圖片的一部分,並支撐翻轉,旋轉,重要用於NOKIA手機中。
  *
  * @param g Graphics
  * @param x int 要畫的地位x
  * @param y int 要畫的地位y
  * @param image Image 圖片
  * @param clipX int clip在圖片中的坐標x
  * @param clipY int clip在圖片中的坐標y
  * @param clipWidth int clip在圖片中的寬度
  * @param clipHeight int clip在圖片中的高度
  * @param mode int 0:直接畫 0x2000:繞Y軸鏡象翻轉 0x4000:繞X軸鏡象翻轉 90:順時針方向90度 180:順時針方向180度 270:順時針方向270度
  */
 voiddrawClipImageFor諾基亞(Graphics g, int x, int y, Image image, int clipX,int clipY, int clipWidth, int clipHeight, int mode) {//只能用left和top畫。只方型有效。長方形待修正
      int oldWidth  = g.getClipWidth();
      int oldHeight = g.getClipHeight();
     if(mode==0)
     {
       g.setClip(x, y, clipWidth, clipHeight);
       g.drawImage(image, x - clipX, y - clipY, 0);
     }
     else{
         DirectGraphics dg=DirectUtils.getDirectGraphics(g);
         switch(mode){        case 0x2000://繞Y軸翻轉
               g.setClip(x, y, clipWidth, clipHeight);
               x = x - (image.getWidth() - clipX - clipWidth);
               y = y - clipY;
               break;
             case 0x4000:// 繞X軸翻轉
               g.setClip(x, y, clipWidth, clipHeight);
               x = x - clipX;
               y = y - (image.getHeight() - clipY - clipHeight);
               break;
             case 90://順時針方向90度
               mode = DirectGraphics.ROTATE_270 ;
               g.setClip(x, y, clipHeight, clipWidth); 
               x = x-(image.getHeight() - clipY - clipHeight);
               y = y-clipX;
               break;
             case 180://順時針方向180度
                 g.setClip(x, y, clipWidth, clipHeight);
                 x = x-(image.getWidth()-clipX-clipWidth);
                 y = y-(image.getHeight()-clipY-clipHeight);
                 break;
             case 270://順時針方向270度
               mode = DirectGraphics.ROTATE_90 ;
               g.setClip(x, y, clipHeight, clipWidth);
               x = x-clipY;
               y = y-(image.getWidth() - clipX - clipWidth);

   break;

         }
         dg.drawImage(image, x, y, 0,mode);
     }
     g.setClip(0, 0, oldWidth , oldHeight);
 }


  /**
  * drawClipImageForMIDP2 畫一個圖片的一部分,支撐翻轉、旋轉。
  * 本函數重要用於MIDP2.0中
  * @param g Graphics
  * @param x int 要畫的地位x
  * @param y int 要畫的地位y
  * @param image Image 圖片
  * @param clipX int clip在圖片中的坐標x
  * @param clipY int clip在圖片中的坐標y
  * @param clipWidth int clip在圖片中的寬度
  * @param clipHeight int clip在圖片中的高度
  * @param mode int 0:直接畫 0x2000:繞Y軸翻轉 0x4000:繞X軸翻轉 90:順時針方向90度 180:順時針方向180度 270:順時針方向270度
  *       由於NOKIA和MIDP2.0對應的把持常量值不一樣,為了保持一致以及移植方便,全部采用自定義的常量值,本函數對
  *       自定義的常量值進行了到MIDP2.0的映射,希看大家應用時留心。
  *
  */
 public void drawClipImageForMIDP2(Graphics g, int x, int y, Image image,
                          int clipX, int clipY,int clipWidth, int clipHeight,int mode) {
   int oldWidth  = g.getClipWidth();
   int oldHeight = g.getClipHeight();
   Sprite sp;
   int nm = 0;
   switch(mode)
   {
           case 0://直接裁減
                   g.setClip(x, y, clipWidth,clipHeight );
                   nm = Sprite.TRANS_NONE;
                   x = x - clipX;
                   y = y - clipY;
                   break;
           case 0x2000://繞Y軸鏡象翻轉
                   g.setClip(x, y, clipWidth,clipHeight );
                   nm  =  Sprite.TRANS_MIRROR;

   x   =  x - (image.getWidth() - clipX - clipWidth);
                   y   =  y - clipY;
                   break;
           case 0x4000://繞X軸鏡象翻轉
                 g.setClip(x, y, clipWidth,clipHeight );
                   nm  =  Sprite.TRANS_MIRROR_ROT180;
            x  =  x - clipX;
            y  =  y - image.getHeight() + clipY + clipHeight;
                   break;
    case 90://順時針旋轉90
            g.setClip(x, y,clipHeight, clipWidth );
            nm  =  Sprite.TRANS_ROT90;
            x = x-(image.getHeight() - clipY - clipHeight);
            y = y-clipX;
            break;
    case 180://順時針旋轉180
            g.setClip(x, y, clipWidth,clipHeight);
            nm  =  Sprite.TRANS_ROT180;
            x = x-(image.getWidth()-clipX-clipWidth);
            y = y-(image.getHeight()-clipY-clipHeight);
            break;
    case 270://順時針旋轉270
            g.setClip(x, y,clipHeight, clipWidth );
            nm  =  nm | Sprite.TRANS_ROT270;
            x = x-clipY;
            y = y-(image.getWidth() - clipX - clipWidth);
            break;
   }

    sp = new Sprite(image);
    sp.setTransform(nm);
    sp.setPosition(x,y);

   sp.paint(g);
    g.setClip(0, 0, oldWidth,oldHeight);
 } 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved