国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在J2ME/MIDP中實現圖像旋轉(一)

2019-11-18 16:20:14
字體:
來源:轉載
供稿:網友

  J2ME是標準版java(J2SE)面向手機、PDA等各類移動和嵌入式設備的縮減版本,是一種獲得眾多廠商的支持和廣泛使用的移動設備開發平臺。圖一展示了J2ME技術的體系結構。它分為三層:虛擬機層,配置層,和簡表層。

  配置層(Configuration)通過對功能的描述,把千差萬別的嵌入式設備進行了功能的說明和分類。它把運算功能有限、內存較小、電力有限的設備,定義在CLDC(有限連接設備配置)規范中,這類設備有PDA 、手機等;把運算能力相對較佳、內存相對較大、電力供應比較充足的設備,定義在CDC(連接設備配置)規范之中,這類設備有電冰箱、機頂盒、車載計算設備等。

  虛擬機層(Virtual Machine)基于宿主操作系統,按照某一種配置,實現了Java虛擬機。CDC配置對應的虛擬機叫CVM,CLDC對應的虛擬機叫做KVM。

  簡表層(PRofile)建立在配置層之上,提供了面向用戶的更高層次的功能,如用戶接口,網絡,數據存儲等。基礎規范(Foundation Profile)和個人規范(Personal Profile)是CDC之上的兩個重要的規范,移動信息設備規范(MIDP)和PDA規范(PDAP)是CLDC之上的兩個重要的規范。當前,無線應用程序的開發主要是在MIDP之上進行的。

  配置層和簡表層共同構成了J2ME的運行環境。如CLDC/MIDP架構構筑了手機應用程序的開發和運行環境。本文所實現的圖像旋轉算法便是基于這種架構的。

  
在J2ME/MIDP中實現圖像旋轉(一)(圖一)


  圖一 J2ME 體系結構

  需要注意的是,這些規范也是在不斷發展的。如早期很多的設備的計算能力非常有限,CLDC1.0就只支持整型數值。后來數隨著設備運算能力的提高,CLDC1.0發展到CLDC1.1,就加如了對浮點運算的支持。對MIDP規范也一樣,從1.0發展到2.0,它通過擴充類和接口的功能,加強了對游戲開發的支持,增加了圖像處理功能(旋轉要用到),增強了對網絡功能的支持,如串口、套接字、https等。

  2D旋轉的數據基礎

  考慮笛卡兒直角坐標系中單個點旋轉的情況。如圖二示,這里點P(x,y)到原點O繞O點逆時針旋轉角度θ后到點P′(x′,y′)。由三角函數的幾何意義,有x = r*cos α ,y = r*si n α和x′ = r*cos(α +θ) , y′ = r*sin(α + θ),推出:

  x′ = x * cos θ – y * sin θ

  y′ = y * cos θ + x * sin θ

  當把旋轉點一般化為Q(x0,y0),得到:

  x′ = x0 + (x - x0) cos θ - (y - y0) sin θ

  y′ = y0 + (y - y0) cos θ + (x - x0) sin θ

  在開發時,我們使用設備坐標系,它以屏幕的左上角為坐標原點,y軸方向向下。此時,我們不妨視θ為饒旋轉點順時針旋轉的角度,這樣,上面的公式依然成立。

  
在J2ME/MIDP中實現圖像旋轉(一)(圖二)


  圖二 2D點的旋轉 一般圖像的旋轉算法

  1、算法思想

  為實現整個圖像的旋轉,我們首先獲取源圖像每個點的像素值。然后根據旋轉點和角度的大小計算出新圖像的大小。再逐點計算源圖像中每個點經旋轉后在新圖像中對應點的坐標,并把相應的像素值賦給它。

  在圖三中,陰影部分為源圖像,O為旋轉點,P、Q分別為旋轉前后圖像左上角的點,cx,cy為O相對于源圖像左上角P點的坐標值。

  這里我們以O為圓心,以O距圖像4個頂點的距離的最大值作為半徑dr畫圓,這樣圖像無論以任何角度旋轉都不會超出這個圓的范圍。于是,我們就以該圓為畫布繪制旋轉所得新圖像。由于實際中圖像是用矩形表示的,于是我們生成和圓的外切正方形(圖中虛線部分)等大小的新圖像。

  對源圖像中任一點(i,j),根據上面的公式,不難計算出旋轉θ度在新圖像中的位置,即相對于Q點的位置(destX , destY):

  destX = dr + (i - cx) *cos(radian) - (j - cy)*sin(radian);

  destY = dr + (j - cy) *cos(radian) + (i - cx)*sin(radian);

  計算出這個位置后,把該點的像素值賦值到這個位置,如此對每個點進行這種變換,即可實現整個圖像的旋轉。

  旋轉后的圖像較大,在實際繪制時需要做位置調整,不難看出,Q點相對于P點的偏移量為(cx-dr , cy-dr)。即假設源圖像的屏幕位置為(a , b),則旋轉后的圖像位置應該為( (a + cx – dr) , (b + cy – dr) )。

  
在J2ME/MIDP中實現圖像旋轉(一)(圖三)


  圖三 旋轉算法示意圖

  2、在J2ME中的算法實現

  我們將上面的思想具體化,得到算法的流程圖(見圖四示)

  
在J2ME/MIDP中實現圖像旋轉(一)(圖四)


  圖四 算法流程圖 在MIDP2.0中,Image類提供了兩個方法:getRGB()和createRGBImage(),分別完成獲取圖像象素信息和通過像素數組創建圖像的功能。借助于這兩個方法,結合上面的流程圖,我們得到實現圖像旋轉算法的代碼,如下面所示。

  /**

  *@param imgSource 源圖像

  *@param cx 旋轉點相對于源圖像坐上角橫坐標

  *@param cy 旋轉點相對于源圖像坐上角縱坐標

  *@param theta 圖像逆時針旋轉的角度

  *@param dd 含2個元素的整形數組,存放新圖像相對源圖像沿x軸和y軸的位置偏移量

  *@return 旋轉后的圖像

  **/

  public Image rotate(Image imgSource, int cx, int cy, double theta, int[] dd) {

   if (Math.abs(theta % 360) < 0.1) return imgSource; //角度很小時直接返回

    int w1 = imgSource.getWidth(); //原始圖像的高度和寬度

    int h1 = imgSource.getHeight();

    int[] srcMap = new int[w1 * h1];

    imgSource.getRGB(srcMap, 0, w1, 0, 0, w1, h1); //獲取原始圖像的像素信息

    int dx = cx > w1 / 2 ? cx : w1 - cx; //計算旋轉半徑

    int dy = cy > h1 / 2 ? cy : h1 - cy;

    double dr = Math.sqrt(dx * dx + dy * dy);

    int wh2 = (int) (2 * dr + 1); //旋轉后新圖像為正方形,其邊長+1是為了防止數組越界

    int[] destMap = new int[wh2 * wh2]; //存放新圖像象素的數組

    double destX, destY;

    double radian = theta * Math.PI / 180; //計算角度計算對應的弧度值

    for (int i = 0; i < w1; i++) {

     for (int j = 0; j < h1; j++) {

      if (srcMap[j * w1 + i] >> 24 != 0) { //對非透明點才進行處理

       // 得到當前點經旋轉后相對于新圖像左上角的坐標

       destX = dr + (i - cx) * Math.cos(radian) + (j - cy)* Math.sin(radian);

       destY = dr + (j - cy) * Math.cos(radian) - (i - cx)* Math.sin(radian);

       //從源圖像中往新圖像中填充像素

       destMap[(int) destY * wh2 + (int) destX] = srcMap[j * w1 + i];

      }

     }

    }

    dd[0] = cx-dr; //返回位置偏移分量

    dd[1] = cy-dr;

    return Image.createRGBImage(destMap, wh2, wh2, true); //返回旋轉后的圖像

  }

(出處:http://m.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台北县| 长沙市| 都兰县| 湟中县| 洛川县| 台东市| 专栏| 合作市| 红安县| 台中市| 邵东县| 祁东县| 保靖县| 察隅县| 正安县| 庆阳市| 阆中市| 宜城市| 通河县| 乐清市| 霞浦县| 鄂伦春自治旗| 高陵县| 驻马店市| 介休市| 綦江县| 科技| 克东县| 微山县| 资兴市| 康定县| 兴和县| 应城市| 彭水| 广南县| 深泽县| 城市| 修水县| 岗巴县| 和顺县| 丰原市|