- 相關(guān)推薦
J2ME插值算法如何實(shí)現(xiàn)圖片的放大縮小
//生成放大縮小后圖形像素buf
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]) {
System.arraycopy(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 = Image.createImage(desW, desH);
DirectUtils.getDirectGraphics(desImg.getGraphics()).
drawPixels(desBuf, true, 0, desW, 0, 0, desW, desH, 0, 444);
return desImg;
}
首先看函數(shù)的頭兩句,很容易,就是獲取原始圖片的寬度和高度
int srcW = srcImg.getWidth(); //原始圖像寬 int srcH = srcImg.getHeight(); //原始圖像高 |
接下來(lái)一句我們要定義一個(gè)short型數(shù)組,作為獲取原始圖片像素信息的緩存
short[] srcBuf = new short[srcW * srcH]; |
再下來(lái)一段,有的朋友可能會(huì)有些不明白,這里要解釋一下。由于getPixels()這個(gè)函數(shù),只能獲取可變圖像的像素信息,非可變圖像,無(wú)法獲取像素信息。所以我們要用srcImg.isMutable() 來(lái)判斷,原始圖像是不是可變圖像,然后分兩種情況來(lái)處理。如果srcImg是可變圖像,我們就直接用getPixels()來(lái)獲取它的像素信息,并保存在srcBuf里。如果srcImg不是可變圖像,我們就需要把srcImage畫到事先生成的可變圖像desImg上,然后再獲取desImg的像素信息。
Image desImg = Image.createImage(srcW, srcH); if (srcImg.isMutable()) { /*如果是可變圖像*/ DirectUtils.getDirectGraphics(srcImg.getGraphics()). getPixels(srcBuf, 0, srcW, 0, 0, srcW, srcH, 444); } else { /*如果是非可變圖像*/ desImg.getGraphics().drawImage(srcImg, 0, 0, 0); DirectUtils.getDirectGraphics(desImg.getGraphics()). getPixels(srcBuf, 0, srcW, 0, 0, srcW, srcH, 444); } |
再往下就是縮放算法的重點(diǎn):插值表的生成。插值表分水平差值表和垂直插值表,我們要分別生成原始圖像矩陣的2種插值表,然后利用插值表生成放大縮小后的圖像矩陣。由于這個(gè)內(nèi)容比較抽象,很難用文字表述清楚,所以我們用實(shí)例進(jìn)行介紹。
大家看下面這個(gè)水平的1*4的表格
-----------------
| 0 | 1 | 2 | 3 |
-----------------
如果要將這個(gè)表格放大成1*6的表格,放大的表格比原始表格多出了2個(gè)格子,我們只能對(duì)這多出來(lái)的2個(gè)格子進(jìn)行插值,才能完成放大的操作,F(xiàn)在結(jié)合生成水平插值表的代碼來(lái)完成這個(gè)過程。
distance = srcW > desW ? srcW : desW; for (int i = 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
【J2ME插值算法如何實(shí)現(xiàn)圖片的放大縮小】相關(guān)文章:
PPT圖片如何點(diǎn)擊放大11-15
J2ME在移動(dòng)設(shè)備上實(shí)現(xiàn)動(dòng)畫程序方法01-22
CAD如何插入圖片03-12
常用排序算法之JavaScript實(shí)現(xiàn)代碼段03-10
Spring如何實(shí)現(xiàn)郵件發(fā)送03-21
如何實(shí)現(xiàn)員工的有效激勵(lì)04-01
Java byte[]轉(zhuǎn)int如何實(shí)現(xiàn)03-16