2008年11月10日 星期一

C++ Builder 實作檢討報告

  BCB的部分,老師從開學到現在已經教過了一點基本的用法,說真的其實也沒有很多。目前除了介紹BCB的一些基本元件之外,也教我們用BCB來開啟一張圖片,然後再用BCB對這張圖片作一些基本的影像處理。到第八週的時候,老師教我們打上簡單的程式碼,讓顏色的數值運算後,輸出一張圖片的互補色。他還有說下次上課的時候,我們要自己做出一個,把一張彩色圖片轉換成灰階圖片的程式,然後把結果顯示在自己BCB的程式上面。

  我平常都是有跟著老師的進度在做,所以覺得還不會很難。只要照著老師給的一些程式碼,知道那程式碼是在做什麼事情的話,稍微改一下就可以輸出灰階的圖片了。不過當然得要先知道彩色轉灰階的運算方式,老師教我們的是用R、G、B三個數值加起來,然後除以三,把得到的值放回原本的R、G、B裡,這樣輸出以後就會變成一張灰階的圖片了。


這個是我做的程式畫面,這一部分應該沒有什麼好說明的,就是一些BCB的元件用滑鼠拉一拉而已。我是將原本的圖片放在左邊的框框裡面,然後在將處理過後的圖片放在右邊的框框裡。我想每個人設計的應該都大同小異吧,畢竟都是看著老師做的......



這個是將圖片讀取進來後,我把它顯示在左邊的框框裡。下面那一條是讀取圖片時,會顯示進度的進度條。這邊的程式碼比較長,而且大概都跟老師用的一樣,所以我就不打出來了。




這是在按下"互補色"按鈕之後,會將處理後的畫面顯示在右邊的框框裡。
下面是我互補色按鈕裡面的程式碼:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  //輸出互補色的圖片的按鈕函數
  //進度條
  ProgressBar1->Position=0;
  ProgressBar1->Max=ImageHeight;

  //計算每一個點的互補色迴圈
  for (i=0;i<imageheight;i++)
  {
    ProgressBar1->StepIt();  //進度條增加
    for (j=0;j<imagewidth;j++)
    //將互補色圖片輸出在Image2
      Image2->Canvas->Pixels[j][i] = (TColor)RGB(255-RMatrix[i][j],255-GMatrix[i]  [j],255- BMatrix[i][j]);

  }
}

這個則是在按下"轉灰階"按鈕後,將輸出的灰階圖片放在右邊的框框裡。
下面是我轉灰階按鈕裡面的程式碼:

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  //轉灰階的按鈕函數
  int gray;
  //進度條
  ProgressBar1->Position=0;
  ProgressBar1->Max=ImageHeight;

  //將每一個點轉換成灰階的迴圈
  for (i=0;i<imageheight;i++)>
  {
    ProgressBar1->StepIt(); //進度條增加
    for (j=0;j<imagewidth;j++)
    {
      //將RGB的值加起來除以3,放在gray變數裡
      gray = (RMatrix[i][j]+GMatrix[i][j]+BMatrix[i][j])/3;
      //將灰階圖片輸出在Image2
      Image2->Canvas->Pixels[j][i] = (TColor)RGB(gray,gray,gray);
    }
  }
}


這是按下"隱藏原始圖片"按鈕時,左邊顯示原始的框框就會消失了,當在按下一次時就會又跑出來了。其實這個只是老師在上課時有提到這個元件的屬性,我就無聊試一試,然後覺得蠻有趣的,所以就把它做成按鈕放上來了...... 這個按鈕比較簡單,我也放一下程式碼好了:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //隱藏原始圖片的函數(純屬功能測試...)
  if( sw==0 )
  {
    ScrollBox1->Visible=false;
    sw=1;
  }
  else
  {
    ScrollBox1->Visible=true;
    sw=0;
  }
}

最後附上一個我程式碼的圖,只是一小部分而已啦~我會在程式碼上面打上一些註解,不然真怕過一個星期之後就忘記那到底是在做什麼了。

最後是我做這個程式目前所碰到的問題:

1.就是有些程式碼太長了,我想換行繼續打,那個要怎麼用啊=.=?

2.在開啟一張圖片的時候,如果按了取消就會出現錯誤。我知道為什麼會發生那個錯誤,因為我們的程式裡面,都是假設有選一張圖片開起來,但是卻沒有處理如果按取消會怎麼執行,所以就有錯誤產生了。雖然知道了,但是我卻不知道要怎麼讓程式判斷,當按了取消後要執行什麼耶。

3.開啟JPG圖檔時雖然會正常的顯示在BCB的程式上,但是卻會跳出有錯誤訊息,並且無法執行BMP的影像處理。

4.有一些程式它會設定,在未執行某個步驟時,有一些按鈕是無法按下去的。我想問一下再BCB裡面,如果我想讓它在未開啟一張影像前,下面的按鈕都先不能按,那這樣要怎麼設定呀?

5.要怎麼將處理過後的影像另存新檔呢?總不能都只是在軟體裡面按按好玩的而已吧=.=


沒有留言:

張貼留言