線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1229
推到 Plurk!
推到 Facebook!

請問如何將縮圖呈列在image中?

尚未結案
enu
中階會員


發表:36
回覆:93
積分:55
註冊:2003-10-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-02 13:02:26 IP:163.27.xxx.xxx 未訂閱
請教各位先進,可否幫小弟看看或修正一下程式; 小弟要將四張圖分別抓到四個image中,可是卻發生了問題,程式寫的不好,不知道有沒有先進可以指導一下,感恩!    
 
Graphics::TBitmap *bmpSrc=new Graphics::TBitmap;
void __fastcall TForm6::Button1Click(TObject *Sender)
{
for(nu=1;nu<=4;nu  )
 {
 if (nu==1)
   {
//產生原圖
   bmpSrc->Width=1024;
   bmpSrc->Height=720;
   bmpSrc->Canvas->Pen->Color=clBlack;
   bmpSrc->Canvas->MoveTo(path[0][0],path[0][1]);
   bmpSrc->Canvas->LineTo(path[1][0],path[1][1]);
  
//copy縮圖到image中
  Image1->Width=bmpSrc->Width/4;
  Image1->Height=bmpSrc->Height/4;      r1=Rect(0,0,bmpSrc->Width,bmpSrc->Height);
  r2=Rect(0,0,Image1->Width,Image1->Height);
  Image1->Canvas->CopyRect(r2,bmpSrc->Canvas,r1);
  }
  delete bmpSrc;
 if (nu==2)
   {
   bmpSrc->Width=1024;
   bmpSrc->Height=720;
   bmpSrc->Canvas->Pen->Color=clBlack;
   bmpSrc->Canvas->MoveTo(path[1][0],path[1][1]);
   bmpSrc->Canvas->LineTo(path[2][0],path[2][1]);
  Image2->Width=bmpSrc->Width/4;
  Image2->Height=bmpSrc->Height/4;      r1=Rect(0,0,bmpSrc->Width,bmpSrc->Height);
  r2=Rect(0,0,Image2->Width,Image2->Height);
  Image2->Canvas->CopyRect(r2,bmpSrc->Canvas,r1);
 }
  delete bmpSrc;
if.........................................
  }
}    
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-02 19:34:31 IP:140.113.xxx.xxx 未訂閱
dear enu:    首先,從你提供的程式碼來看,if...的安排就有問題。當 nu = 2 時,bmpSrc就會被delete掉。請自行trace一下便知道邏輯上的錯誤。    既然用了for迴圈,那冗餘的程式碼應該是能被簡化的。以下將你的程式碼利用 FindComponent來簡化(假設宣告都沒問題),希望這是你的意思~
void __fastcall TForm6::Button1Click(TObject *Sender)
{
  Graphics::TBitmap *bmpSrc = new Graphics::TBitmap;
  const AnsiString ImageNamePrefix = "Image";
  TImage* IMAGE;
  TRect r1, r2;      for(int nu = 1; nu <= 4; nu  )
  {
    // 產生原圖
    bmpSrc->Width  = 1024;
    bmpSrc->Height = 720;
    bmpSrc->Canvas->Pen->Color = clBlack;
    bmpSrc->Canvas->MoveTo(path[nu-1][0], path[nu-1][1]);
    bmpSrc->Canvas->LineTo(path[nu][0],   path[nu][1]);
 
    // 讓IMAGE指向指定的Image
    IMAGE = (TImage*)FindComponent(ImageNamePrefix   IntToStr(nu));        // copy縮圖到image中
    IMAGE->Width  = bmpSrc->Width / 4;
    IMAGE->Height = bmpSrc->Height / 4;        r1 = Rect(0, 0, bmpSrc->Width, bmpSrc->Height);
    r2 = Rect(0, 0, IMAGE->Width, IMAGE->Height);
    IMAGE->Canvas->CopyRect(r2, bmpSrc->Canvas, r1);
  }
  
  // 歸還bmpSrc
  delete bmpSrc;
}
FindComponent的用法(參考BCB Help)
TComponent* __fastcall FindComponent(const AnsiString AName);
或是找找站上的文章吧
enu
中階會員


發表:36
回覆:93
積分:55
註冊:2003-10-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-03 02:12:59 IP:218.165.xxx.xxx 未訂閱
謝謝arisaka_matsuri先生,原來還有這個用法,受教了!又學到一招。 可否再請教,根據這樣的寫法簡化了程式,可是問題出現在這裡:
bmpSrc->Canvas->MoveTo(path[nu-1][0], path[nu-1][1]);
bmpSrc->Canvas->LineTo(path[nu][0],   path[nu][1]);
bmpSrc第二張圖以後都把前面的圖也加進去了,但小弟希望每一張圖只處理自己的一條線,這時卻不知如何修正了?懇請賜教!謝謝!
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-03 12:02:17 IP:140.113.xxx.xxx 未訂閱
dear enu:    原來如此,那麼,你可以在for迴圈最後清掉整個canvas
for(...)
{
  .
  .
  .
  // 清掉canvas
  bmpSrc->Canvas->Brush->Color = clWhite;
  bmpSrc->Canvas->FillRect(r1);
}
這樣應該可以~
enu
中階會員


發表:36
回覆:93
積分:55
註冊:2003-10-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-03 13:45:44 IP:163.27.xxx.xxx 未訂閱
還有這招呀!感恩!感恩!
系統時間:2024-07-03 5:53:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!