全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1841
推到 Plurk!
推到 Facebook!

請問圖檔縮小的平滑法有沒有更快的算法?我是用的站長平滑法的算法.

尚未結案
bitbug
一般會員


發表:6
回覆:11
積分:3
註冊:2004-09-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-24 00:15:13 IP:222.181.xxx.xxx 未訂閱
請問圖檔縮小的平滑法有沒有更快的算法?我是用的站長平滑法的算法,感覺很慢的說,有沒有朋友知道像ACDSEE那樣快的算法,謝謝各位. 發表人 - bitbug 於 2004/10/24 00:18:09
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-24 13:29:39 IP:61.222.xxx.xxx 未訂閱
我約略看一下站長的平滑算法,是用Pixels來取得。 這樣的效率會比較差。因該改用 ScanLine 會比較快。
bitbug
一般會員


發表:6
回覆:11
積分:3
註冊:2004-09-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-27 23:47:02 IP:222.181.xxx.xxx 未訂閱
引言: 我約略看一下站長的平滑算法,是用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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-28 10:25:52 IP:219.134.xxx.xxx 未訂閱
拜託以後如果要貼程式碼上來,請跟著站長那樣做~~[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=0)and(dx 發表人 - japhenchen 於 2004/10/28 10:39:53 發表人 - japhenchen 於 2004/10/28 13:11:13
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-28 13:34:26 IP:211.96.xxx.xxx 未訂閱
我發現使用copyrect的速度不亞於使用scanline耶! 藏私の禁止
bitbug
一般會員


發表:6
回覆:11
積分:3
註冊:2004-09-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-28 20:00:43 IP:222.181.xxx.xxx 未訂閱
引言: 我發現使用copyrect的速度不亞於使用scanline耶! 藏私の禁止
大哥!看清題目好不好... 我是問的平滑縮小.不是縮小. 看看我貼的站長的算法,不是直接縮小的. 謝謝... < >< >
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-29 08:23:01 IP:219.134.xxx.xxx 未訂閱
還是用api比較快 用copyrect之前加一句 SetStretchBltMode(Bmp2.Canvas.Handle,HALFTONE); // bmp2是你的目的地 你可以做放大效果看看 藏私の禁止
bitbug
一般會員


發表:6
回覆:11
積分:3
註冊:2004-09-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-29 16:53:42 IP:222.181.xxx.xxx 未訂閱
引言: 還是用api比較快 用copyrect之前加一句 SetStretchBltMode(Bmp2.Canvas.Handle,HALFTONE); // bmp2是你的目的地 你可以做放大效果看看 藏私の禁止
API是很快.可是API可以達到平滑的目的嘛? 站長那個平滑縮小算法很不錯,可是就是太滿... 我又不知道那個代碼怎么改寫成SCANLINE的... 誰幫忙改改
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-29 17:28:53 IP:61.222.xxx.xxx 未訂閱
to bitbug 大大 您不會自己改。 等會有空在幫你改。...
bitbug
一般會員


發表:6
回覆:11
積分:3
註冊:2004-09-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-29 18:52:44 IP:222.181.xxx.xxx 未訂閱
引言: to bitbug 大大 您不會自己改。 等會有空在幫你改。...
謝謝哦.
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-30 22:40:20 IP:218.18.xxx.xxx 未訂閱
這個api確定可以讓縮放圖片時會出現的雜色點跟黑線都被平滑掉,況且我也沒理由不相信api的效能,原本我用scanline處理圖檔縮放時都會出現不平滑跟跟放大時會出現的無色間隙線,但用了這個api之後,不但速度比scanline還快一些,而且還會幫你做平滑處理,速度快了很多~ 藏私の禁止
bitbug
一般會員


發表:6
回覆:11
積分:3
註冊:2004-09-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-31 15:40:10 IP:222.181.xxx.xxx 未訂閱
引言: 這個api確定可以讓縮放圖片時會出現的雜色點跟黑線都被平滑掉,況且我也沒理由不相信api的效能,原本我用scanline處理圖檔縮放時都會出現不平滑跟跟放大時會出現的無色間隙線,但用了這個api之後,不但速度比scanline還快一些,而且還會幫你做平滑處理,速度快了很多~ 藏私の禁止
非常感謝...
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-11-04 18:57:37 IP:218.18.xxx.xxx 未訂閱
JCL 和 JVCL 那套元件里有平滑放大图片的SOURCE,效果不错,速度很快。
系統時間:2024-04-26 8:31:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!