請問圖檔縮小的平滑法有沒有更快的算法?我是用的站長平滑法的算法. |
尚未結案
|
bitbug
一般會員 發表:6 回覆:11 積分:3 註冊:2004-09-10 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
bitbug
一般會員 發表:6 回覆:11 積分:3 註冊:2004-09-10 發送簡訊給我 |
引言: 我約略看一下站長的平滑算法,是用Pixels來取得。 這樣的效率會比較差。因該改用 ScanLine 會比較快。這樣的縮小可以用SCANLINE嗎?能幫我改改嗎? 或者誰有快點的算法?謝謝~~ < >< > x1:=bmp1.width; y1:=bmp1.height; x2:=bmp2.width; y2:=bmp2.height; dx:=0; x0:=0; for x:=0 to bmp2.width-1 do begin dy:=0; y0:=0; dx:=dx x1; nx:=0; while dx>=x2 do begin inc(x0); inc(nx); dx:=dx-x2; end; for y:=0 to bmp2.height-1 do begin dy:=dy y1; ny:=0; while dy>=y2 do begin inc(y0); inc(ny); dy:=dy-y2; end; r:=0; g:=0; b:=0; tot:=0; for i:=0 to nx do for j:=0 to ny do begin c:=bmp1.Canvas.Pixels[x0-i,y0-j]; r:=r (c shr 16); g:=g ((c shr 8) and 255); b:=b (c and 255); inc(tot); end; r:=r div tot; g:=g div tot; b:=b div tot; c:=(r shl 16) (g shl 8) b; bmp2.Canvas.Pixels[x,y]:=c; end; end; |
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
拜託以後如果要貼程式碼上來,請跟著站長那樣做~~[code]....[/code] 懶人有懶法 把bmp1縮小放到bmp2是吧,用copyrect不就得了
bmp2.Canvas.CopyRect(bmp2.Canvas.cliprect,bmp1.Canvas,bmp1.Canvas.ClipRect);
這句的第一個參數大小可以隨你訂,TRect型態,上面那句的意思就是把BMP1的內容物整個(CLIPRECT)全部貼到BMP2上,自動依照BMP2的大小縮放,如果BMP2的尺寸跟BMP1一樣,那就是原封不動的複制,如果小於,就是縮小拷貝,如果大於,就是放大,一句話,搞定你寫了幾十行的工作 不想偷懶?那就只好做苦工啦
利用SCANLINE,按比例計算BMP2上的落點填色 我幫你把你的程式重排一下先!
x1:=bmp1.width; y1:=bmp1.height; x2:=bmp2.width; y2:=bmp2.height; dx:=0; x0:=0; for x:=0 to bmp2.width-1 do begin dy:=0; y0:=0; dx:=dx x1; nx:=0; while dx>=x2 do begin inc(x0); inc(nx); dx:=dx-x2; end; for y:=0 to bmp2.height-1 do begin dy:=dy y1; ny:=0; while dy>=y2 do begin inc(y0); inc(ny); dy:=dy-y2; end; r:=0; g:=0; b:=0; tot:=0; for i:=0 to nx do for j:=0 to ny do begin c:=bmp1.Canvas.Pixels[x0-i,y0-j]; r:=r (c shr 16); g:=g ((c shr 8) and 255); b:=b (c and 255); inc(tot); end; r:=r div tot; g:=g div tot; b:=b div tot; c:=(r shl 16) (g shl 8) b; bmp2.Canvas.Pixels[x,y]:=c; end; end; end;...................我看的快暈倒了,只是為了縮小圖像而已? 我改進一下下 < class="code"> type PArr = ^TRGBTripleArray; TRGBTripleArray = array [Byte] of TRGBTriple; var bmp : TBitmap; bmp1xp ,bmp2xp: PArr ; // 用來記錄Scanline得到的圖像的陣列用的, // TRGBTripleArray是24位元全彩的RGB圖檔用的, // 如果不是24bits的圖檔,請先轉換(直接改bmp的pixelformat就可以) hRate , vRate: double; // bmp2跟bmp1之間的橫向跟縱向比例值(縮放用的) x , y ,dx ,dy : integer ;// x跟y用來做bmp1的橫縱座標迴圈用 bmp2w, bmp2h , bmp1h ,bmp1w : integer; // 用來記錄二圖的長寬用的,為什麼要脫褲子放屁? // 因為如果在需要快速計算的過程中,才讀取元件屬性,速度會掉下來哦 begin if (bmp1.width=0)or(bmp1.width=0) then exit ; // 不然可能會出現除0錯誤 hRate := bmp2.width/bmp1.width; vRate := bmp2.height/bmp1.height; // 把二圖的比例算出來 bmp1w := bmp1.width; bmp1h := bmp1.height; bmp2w := bmp2.width; bmp2h := bmp2.height; for y := 0 to (bmp1h-1) do begin bmp1xp:=bmp1.ScanLine[y]; dy:=round(y*vRate); if (dy>=0)and(dy |
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
bitbug
一般會員 發表:6 回覆:11 積分:3 註冊:2004-09-10 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
bitbug
一般會員 發表:6 回覆:11 積分:3 註冊:2004-09-10 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
bitbug
一般會員 發表:6 回覆:11 積分:3 註冊:2004-09-10 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
bitbug
一般會員 發表:6 回覆:11 積分:3 註冊:2004-09-10 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |