J2ME插值算法如何實現圖片的放大縮小
short[] desBuf = new short[desW * desH];
int dx = 0;
int dy = 0;
int sx = 0;
int sy = 0;
int oldy = -1;
for (int i = 0; i < desH; i++) {
if (oldy == tabY[i]) {
ycopy(desBuf, dy - desW, desBuf, dy, desW);
} else {
dx = 0;
for (int j = 0; j < desW; j++) {
desBuf[dy + dx] = srcBuf[sy + tabX[j]];
dx++;
}
sy += (tabY[i] - oldy) * srcW;
}
oldy = tabY[i];
dy += desW;
}
//生成圖片
desImg = teImage(desW, desH);
irectGraphics(raphics()).
drawPixels(desBuf, true, 0, desW, 0, 0, desW, desH, 0, 444);
return desImg;
}
首先看函數的頭兩句,很容易,就是獲取原始圖片的寬度和高度
intsrcW=idth();//原始圖像寬 intsrcH=eight();//原始圖像高 |
接下來一句我們要定義一個short型數組,作為獲取原始圖片像素信息的緩存
short[]srcBuf=newshort[srcW*srcH]; |
再下來一段,有的朋友可能會有些不明白,這裏要解釋一下。由於getPixels()這個函數,只能獲取可變圖像的像素信息,非可變圖像,無法獲取像素信息。所以我們要用table() 來判斷,原始圖像是不是可變圖像,然後分兩種情況來處理。如果srcImg是可變圖像,我們就直接用getPixels()來獲取它的像素信息,並保存在srcBuf裏。如果srcImg不是可變圖像,我們就需要把srcImage畫到事先生成的可變圖像desImg上,然後再獲取desImg的'像素信息。
ImagedesImg=teImage(srcW,srcH); if(table()){/*如果是可變圖像*/ irectGraphics(raphics()). getPixels(srcBuf,0,srcW,0,0,srcW,srcH,444); }else{/*如果是非可變圖像*/ raphics()Image(srcImg,0,0,0); irectGraphics(raphics()). getPixels(srcBuf,0,srcW,0,0,srcW,srcH,444); } |
再往下就是縮放算法的重點:插值表的生成。插值表分水平差值表和垂直插值表,我們要分別生成原始圖像矩陣的2種插值表,然後利用插值表生成放大縮小後的圖像矩陣。由於這個內容比較抽象,很難用文字表述清楚,所以我們用實例進行介紹。
大家看下面這個水平的1*4的表格
-----------------
| 0 | 1 | 2 | 3 |
-----------------
如果要將這個表格放大成1*6的表格,放大的表格比原始表格多出了2個格子,我們只能對這多出來的2個格子進行插值,才能完成放大的操作。現在結合生成水平插值表的代碼來完成這個過程。
distance=srcW>desW?srcW:desW; for(inti=0;i<=distance;i++){/*水平方向*/ tabX[db]=(short)sb; tems+=srcW; temd+=desW; if(tems>distance){ tems-=distance; sb++; } if(temd>distance){ temd-=distance; db++; } } |
很明顯原始表格寬度srcW = 4;放大後的表格寬度desW = 6;所以distance = desW = 6
-
關於Java Socket網絡傳輸的序列化機制
採用JavaSocket網絡傳輸的`序列化機制,將對象壓扁成二進制字節,將二進制字節在網絡中傳輸;自定義協議,將對象用字符串描述出來,將字符串用二進制表示,在網絡中傳輸,在另外一邊用相反的策略解析這個字符串,重新構造業務對象,這個方法能夠在異構平台中進行傳輸而不變形,但...
-
SUN認證考試知識點:java讀取文件內容的函數
publicstaticStringreadFile(StringfileName){Stringoutput="";Filefile=newFile(fileName);if(ts()){if(le()){try{BufferedReaderinput=newBufferedReader(newFileReader(file));StringBufferbuffer=newStringBuffer();Stringtext;while((text=Line())!=null...
-
Java讀取xml文件的方法
xml文件:Xml代碼A1234XX省XX市B1234XX省XX市二七區第一種DOM實現方法:Java代碼import;importmentBuilder;importmentBuilderFactory;importment;importList;publicclassMyXMLReader2DOM{publicstaticvoidmain(Stringarge[]){longlasting=entTimeMillis();try{Fil...
-
Sun軟件策略放源代碼
Sun目前的軟件策略可以總結為一個詞:開放源代碼。Sun已經使SolarisUnix操作系統開放源代碼化,Sun公司CEO喬納森表示,Sun將最終使其所有軟件技術開放源代碼化,甚至包括Java編程語言。Sun的目的是用開放源代碼商業模式的破壞力蠶食其它軟件廠商的市場份額。與兩年前...