J2me中任意角度圖片旋轉(zhuǎn)(一)(轉(zhuǎn)載)2007-09-23 12:00原文位置:http://mobile.csdn.net/page/4367e2f2-01b3-4ab9-8ba0-7f6cf90b7974
作者:pandonix
日期:2007年9月20日
版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
原文地址:
http://pandonix.javaeye.com/
本文主要討論在J2me中如何實(shí)現(xiàn)任意角度的圖片旋轉(zhuǎn)。其實(shí),早在幾年前,minisoyou的BB就已經(jīng)給出了實(shí)現(xiàn)算法,相信做j2me游戲開發(fā)的朋友們也都收藏過(guò)該算法。本文從圖像旋轉(zhuǎn)的基本理論出發(fā),詳細(xì)討論如何使用實(shí)現(xiàn)和優(yōu)化該算法,希望對(duì)旋轉(zhuǎn)算法感興趣的朋友有幫助。
基本旋轉(zhuǎn)算法:
討論位圖旋轉(zhuǎn)算法,首先得說(shuō)說(shuō)最基本的旋轉(zhuǎn)算法,即:點(diǎn)的旋轉(zhuǎn)。相信學(xué)過(guò)計(jì)算機(jī)圖形學(xué)的朋友們,對(duì)該算法不會(huì)陌生。
假設(shè),P(x,y)旋轉(zhuǎn)t角度后,得到P’(x’,y’),P與P’之間的關(guān)系如下:
(x’,y’) = (x cos(t) + y sin(t),y cos(t) - x sin(t))
位圖旋轉(zhuǎn):
根據(jù)以上算法,可以直觀的想到位圖旋轉(zhuǎn)算法,即遍歷位圖中的所有像素點(diǎn),對(duì)每個(gè)像素點(diǎn)進(jìn)行旋轉(zhuǎn)變換。
但是在j2me中真正實(shí)現(xiàn)位圖的旋轉(zhuǎn),還需要解決以下幾點(diǎn)問題:
1、如何獲取圖片的像素?cái)?shù)組,且得到的像素值是包含了alpha高位的,換句話說(shuō),要支持透明;
2、由于是任意角度旋轉(zhuǎn),旋轉(zhuǎn)后的圖像尺寸如何計(jì)算;
3、旋轉(zhuǎn)算法可以優(yōu)化,提高計(jì)算速度;
4、旋轉(zhuǎn)得到的像素?cái)?shù)組,如何繪制到canvas上;
5、旋轉(zhuǎn)后能否直接得到一個(gè)Image對(duì)象;
6、旋轉(zhuǎn)算法都是基于小數(shù)運(yùn)算的,在CLDC1.0的設(shè)備上,如何實(shí)現(xiàn)旋轉(zhuǎn);
7、旋轉(zhuǎn)后的圖像是否存在失真;
J2me中的像素操作
熟悉j2me的朋友對(duì)于問題一的回答應(yīng)該是肯定的。我們有兩種方法獲取像素?cái)?shù)組,一種是使用midp2.0中的getRGB方法,另一種是使用NokiaUI中的getPixels方法,兩種方法各有優(yōu)缺點(diǎn)。其中,getRGB方法并非所有midp2.0都手機(jī)都支持,本人在Nokia6600上面使用該方法就出現(xiàn)問題,除此之外,getRGB只能獲取到8888格式的ARGB像素值,即通常說(shuō)的256色。而NokiaUI重載了三個(gè)getPixels方法,不僅支持8888格式,還支持4444格式,即,可以使用short數(shù)組來(lái)存儲(chǔ)像素值,而無(wú)須使用int數(shù)組。
由于getRGB方法很簡(jiǎn)單,參考API文檔就能使用,所以,在此只列出NokiaUI中如何獲取像素?cái)?shù)組:
java 代碼
public short[] pixelsProduce(Image src)
{
int w = src.getWidth();
int h = src.getHeight();
short[] _pixels = new short[w * h];
//創(chuàng)建可變圖像
Image img = DirectUtils.createImage(w, h, 0);
Graphics g = img.getGraphics();
DirectGraphics dg = DirectUtils.getDirectGraphics(g);
//先將原圖繪制到創(chuàng)建好的可變圖像上
dg.drawImage(src,0,0,0,0);
//再獲取該可變圖像的像素?cái)?shù)組
dg.getPixels(_pixels,0, w, 0, 0, w, h,4444);
return _pixels;
}
解決了獲取圖片像素?cái)?shù)組的問題,繪制旋轉(zhuǎn)后的像素?cái)?shù)組的問題也迎刃而解了。Midp2.0中,可以使用drawRGB,而NokiaUI中,則使用drawPixels。當(dāng)然,如果考慮到繪制的效率,可以將像素?cái)?shù)組轉(zhuǎn)化為Image對(duì)象,這樣雖然創(chuàng)建時(shí)耗費(fèi)了時(shí)間,但是在繪制時(shí),卻比直接繪制像素?cái)?shù)組更加有效率。為此,Midp2.0中,可使用Image.createRGBImage方法,而NokiaUI中,則可以采用以下方法來(lái)獲取Image對(duì)象:
java 代碼
public Image createImg(short[] pixels,int _width,int _height)
{
//創(chuàng)建可變圖像
Image img = DirectUtils.createImage(_width, _height, 0);
Graphics g = img.getGraphics();
DirectGraphics dg = DirectUtils.getDirectGraphics(g);
//將像素?cái)?shù)組繪制到創(chuàng)建好的可變圖像上
dg.drawPixels(pixels, true, 0, _width, 0, 0, _width, _height, 0,4444);
return img;
|
|