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

[bcb][問題]縮圖長寬比例失真

尚未結案
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-30 23:33:13 IP:61.230.xxx.xxx 未訂閱
我今天寫了一個縮圖程式 結果發現縮圖產生了失真 比如說:一個彎月->縮圖後(很肥的彎月) 我的程式碼如下
void TForm2::down_sampling(TImage *Source,TImage *Target)
{
     int sx=0,sy=0;
     int dy=(int)(Source->Height/64);
     dy=(dy>1)?(int)dy:1;
     int dx=(int)(Source->Width/64);
     dx=(dx>1)?(int)dx:1;
     int d=(dx>dy)?dx:dy;
   //利用downsampling的原理顯示檢索圖檔的縮圖         for (int y=0;yHeight;y =d)
      {
        for(int x=0;xWidth;x =d)
        {             Target->Canvas->Pixels[sx][sy]=Source->Canvas->Pixels[x][y];
         sx  ;
         }
         sx=0;
         sy  ;
       }    }
還請各位大大多多指點
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-31 11:25:44 IP:140.135.xxx.xxx 未訂閱
plihui您好: 您可以參考下面連結的方式,調整寬與高看看效果會不會比較好 http://delphi.ktop.com.tw/topic.php?topic_id=32831 使用CopyRect http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732 【發表】影像處理-內插法應用於圖片縮放 BY JerryKuo版主 順心
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-03 14:36:02 IP:140.129.xxx.xxx 未訂閱
引言:
 
void TForm2::down_sampling(TImage *Source,TImage *Target)
{
     int sx=0,sy=0;
     int dy=(int)(Source->Height/64);
     dy=(dy>1)?(int)dy:1;
     int dx=(int)(Source->Width/64);
     dx=(dx>1)?(int)dx:1;
     int d=(dx>dy)?dx:dy;
   //利用downsampling的原理顯示檢索圖檔的縮圖         for (int y=0;yHeight;y =d)
      {
        for(int x=0;xWidth;x =d)
        {             Target->Canvas->Pixels[sx][sy]=Source->Canvas->Pixels[x][y];
         sx  ;
         }
         sx=0;
         sy  ;
       }    }
plihui您好: 依您的程式碼可以看出,在x,y方向您的取樣點的比例,並沒有正確的給定。 所以導致某些情形下可能會產生過寬或過長的現象。 其實dy的值已經表示了:我們要把多少點當成一點, x,y方向皆然。 所以如單純就您的程式碼來修改,我的建議是: 將dx的部分移去,並令d=dy,應該就可以了。
void TForm2::down_sampling(TImage *Source,TImage *Target)
{
     int sx=0,sy=0;
     int dy=(int)(Source->Height/64);
     dy=(dy>1)?(int)dy:1;
   
     d = dy; 
     //利用downsampling的原理顯示檢索圖檔的縮圖
     .....    
祝好! RichTop 敬上
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-03 20:25:00 IP:61.230.xxx.xxx 未訂閱
我想你可能誤解
     int dy=(int)(Source->Height/64);
     dy=(dy>1)?(int)dy:1;
     int dx=(int)(Source->Width/64);
     dx=(dx>1)?(int)dx:1;
     int d=(dx>dy)?dx:dy;
的原意了... 我這段程式碼的用法是假設我不知道長寬誰比較長 所以當場長>寬時->縮圖長設為64.... 並非縮圖寬一並設為64..
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-05 11:00:04 IP:61.230.xxx.xxx 未訂閱
引言: 我今天寫了一個縮圖程式 結果發現縮圖產生了失真 比如說:一個彎月->縮圖後(很肥的彎月) 我的程式碼如下
void TForm2::down_sampling(TImage *Source,TImage *Target)
{
     int sx=0,sy=0;
     int dy=(int)(Source->Height/64);
     dy=(dy>1)?(int)dy:1;
     int dx=(int)(Source->Width/64);
     dx=(dx>1)?(int)dx:1;
//     int d=(dx>dy)?dx:dy;
   //利用downsampling的原理顯示檢索圖檔的縮圖         for (int y=0;yHeight;y =d)
     for (int y=0;yHeight;y =dy)
      {
        for(int x=0;xWidth;x =d)
        for(int x=0;xWidth;x =dx)
        {             Target->Canvas->Pixels[sx][sy]=Source->Canvas->Pixels[x][y];
         sx  ;
         }
         sx=0;
         sy  ;
       }    }
plihui你好: dx,dy是用來決定下一點x,y軸取樣的位置,當你用
int d=(dx>dy)?dx:dy;
時,則表示取樣的位置不是用dx就是dy,二者擇一 此時x軸的取樣間距d就跟y軸的取樣間距d是一樣的 影像的長寬本來就不等長,卻使用同一個取樣間距, 縮小之後的圖,是不成比例產生出來的。 舉個例 16x8的影像,分成四等分取樣,x,y軸的取樣間距分別為dx=4,dy=2 取最大值d = dx = 4,取樣間距統一變成4,則y軸取樣方式 變成二等分,取樣的方式就不成比例囉。 建議改成紅色的部分 ^^
系統時間:2024-05-10 7:34:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!