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

有關 Bitmap 與 TList 的問題

答題得分者是:RedSnow
Ansonku
一般會員


發表:13
回覆:15
積分:5
註冊:2002-10-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-30 01:27:56 IP:61.64.xxx.xxx 未訂閱
想要練習寫一些影像的程式 假如說我要對一個影像作一些處理 並且希望把處理步驟留下來    就像是 photoshop 裡面的步驟紀錄一樣 我隨時可以恢復到某個步驟 我想到的方法是用 TList 但遇到一些問題 我的程式如下
 
//---------------------------------------------------------------------------
#include 
#include 
#include "kimage.cpp"
#pragma hdrstop    #include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CGAUGES"
#pragma resource "*.dfm"
TForm1 *Form1;
TList *MyList;
AnsiString FileName;
int RecordNum;          //紀錄目前BMP編號    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
MyList=new TList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::N2Click(TObject *Sender)
{
   if(MyList->Count>0)
   {
      for(int i=MyList->Count-1;i>=0;i--){
      delete (Graphics::TBitmap*)MyList->Items[i];
      MyList->Delete(i);
      }
      MyList->Clear();
      MyList=NULL;
   }           if(OpenPictureDialog1->Execute()){
        FileName=OpenPictureDialog1->FileName;            if(LowerCase(ExtractFileExt(FileName))==".jpg"||LowerCase(ExtractFileExt(FileName))==".jpeg"){
           Graphics::TBitmap *fBmp;
           fBmp=Jpg2Bmp(FileName);
           Image1->Picture->Assign(fBmp);
           MyList->Add(Image1->Picture->Bitmap);
           RecordNum=0;
        }
        else if(LowerCase(ExtractFileExt(FileName))==".bmp"){
           Graphics::TBitmap *fBmp;
           fBmp->LoadFromFile(FileName);
           Image1->Picture->Bitmap->Assign(fBmp);
           MyList->Add(Image1->Picture->Bitmap);
           RecordNum=0;
        }else{
           ShowMessage("影像格式錯誤!!");
        }
   }
}
//---------------------------------------------------------------------------        void __fastcall TForm1::N3x31Click(TObject *Sender)
{
        int k[9]={1,1,1,1,1,1,1,1,1};
        vector fv(k,k 9);            Graphics::TBitmap *fBmp=new Graphics::TBitmap;            fBmp=ImgFilterV((Graphics::TBitmap*)MyList->Items[0],fv,9,ProgressBar1);
        MyList->Add(fBmp);
        RecordNum  ;            Image1->Picture->Bitmap->Assign((Graphics::TBitmap*)MyList->Items[RecordNum]);
        Image2->Picture->Bitmap->Assign((Graphics::TBitmap*)MyList->Items[0]);    }
//---------------------------------------------------------------------------    Graphics::TBitmap* ImgFilterV(const Graphics::TBitmap *fBmp,vector fvec,int fsum=1,TProgressBar *fPBar=NULL){            int r,g,b;
        int index=((int)sqrt(fvec.size())-1)/2;            if(fPBar!=NULL){
           fPBar->Position=0;
           fPBar->Max=fBmp->Height;
           fPBar->Step=1;
        }            //複製最外圈的點
        static Graphics::TBitmap* fDesc= new Graphics::TBitmap();
        fDesc->PixelFormat=pf24bit;            fDesc->Assign((Graphics::TBitmap*)fBmp);            for( int y = index; y < fBmp->Height-index; y   ) {
           for( int x = index; x < fBmp->Width-index; x   ){
              r=b=g=0;
              int k = 0;
                  for( int u = x - index; u <= x   index; u   ) {
              for( int v = y - index; v <= y   index; v   ){
                      r  =GetRValue(fBmp->Canvas->Pixels[u][v ])*fvec[k];
                      g  =GetGValue(fBmp->Canvas->Pixels[u][v ])*fvec[k];
                      b  =GetBValue(fBmp->Canvas->Pixels[u][v ])*fvec[k];
                      k  ;
                   }
              }
                r/=fsum;
                g/=fsum;
                b/=fsum;
                fDesc->Canvas->Pixels[x][y] =(TColor)RGB(r,g,b);            }
                if(fPBar!=NULL){
                fPBar->Position =1;
                }
        }            return fDesc;
}    
處理步驟 1.開啟 jpg 此時會加入 TList 連結 2.將開啟的圖片經過ImgFilterV 處理,此時會傳回一個新的 Bitmap 我一樣加入 TList 所以此時 TList->Items[0] = 原來圖檔 TList->Item2[1] = 這是處理過後的圖檔 最後我會在 Image1 中秀出 處理過後的圖檔 而 Image2 中秀出 原來的圖檔 但是結果並非如此 Image1 中秀出 處理過後的圖檔 Image2 也秀出 處理過後的圖檔 TList->Items[0] 中的 link 是錯了嗎 不然怎麼會都是秀出處理過後的圖檔 不知道各位前輩知道不知道小弟是否哪邊觀念不對 另外有更好的方法來管理處理過程所產稱的圖檔嗎? 謝謝~~ 發表人 -
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-30 23:29:48 IP:59.115.xxx.xxx 未訂閱
Ansonku 您好:    您把下列這兩行的順序掉換一下應該就可以了:
Image1->Picture->Bitmap->Assign((Graphics::TBitmap*)MyList->Items[RecordNum]);
Image2->Picture->Bitmap->Assign((Graphics::TBitmap*)MyList->Items[0]);
因為 MyList 的 Items[0] 存放的是 Image1 的 Bitmap,您先將處理過的 Bitmap 設給 Items[1] 的 Bitmap,接著又將 Items[1] 的 Bitmap 設給了 Image1 的 Bitmap,此時的 Items[0] 的內容已經變成處理過的內容了,當您再將 Items[0] 設給 Image2 的 Bitmap 時,兩者當然相同囉。 或者將載入圖檔後的 MyList->Add(Image1->Picture->Bitmap); 設定敘述改成 MyList->Add(fBmp); 也行。 7 天天敲鍵盤 v 時時按滑鼠 8
Ansonku
一般會員


發表:13
回覆:15
積分:5
註冊:2002-10-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-01 09:14:59 IP:220.130.xxx.xxx 未訂閱
可否再請教前輩 MyList->Add(Image1->Picture->Bitmap); 這個是將 Image1->Picture->Bitmap 這個指標位置加到 MyList 中嗎? 還是完整的複製一份 Image1->Picture->Bitmap 給 MyList 另外 Image2->Picture->Bitmap->Assign((Graphics::TBitmap*)MyList->Items[0]); 這個 assign 也是把 MyList->Item[0] 這個指標給 Image2->Picture->Bitmap 嗎? 搞不大清楚這兩個指令到底是完整的複製還是只是將記憶體的指標傳給它 謝謝~~
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-01 09:58:48 IP:61.66.xxx.xxx 未訂閱
MyList->Add(Image1->Picture->Bitmap); 這個是把指標位置加到MyList裡 另外 Image2->Picture->Bitmap->Assign((Graphics::TBitmap*)MyList->Items[0]); 這個是把MyList->Items[0]所指到的Bitmap複製到Image2->Picture->Bitmap裡面
系統時間:2024-04-25 12:38:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!