2009年10月2日 星期五

hw1





































一開始在動態宣告記憶體的地方有點困惑.不過後來老師提醒一下就可以繼續了

程式碼部分.首先讀圖指令:

OpenPictureDialog1->Execute();
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

然後取得該張圖片的長寬
可用以下2行指令
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(Image1->Picture->Bitmap);

iImageHeight= Bmp->Height;
iImageWidth = Bmp->Width;

確切的意思我沒有很懂.大概式宣告一個圖形變數.把它和image1結合在一起


然後在宣告陣列.因為一個pixel有三元素RGB.所以各宣告一個陣列.所以總共是3

 try
  {
   ucMR = new unsigned char *[iImageHeight];
   for (j=0;jucMR[j] = new unsigned char [iImageWidth];
  }
 catch (std::bad_alloc)
  {
    ShowMessage("Could not allocate memory...Bye");
    exit(-1);
  }


再來就是用for迴圈來儲存每個pexel的每個RGB值
for(i=0;iHeight;i++)
  for(j=0;jWidth;j++)
    {
     ucMR[i][j] =GetRValue(Image1->Canvas->Pixels[i][j]);
    ucMG[i][j] =GetGValue(Image1->Canvas->Pixels[i][j]);
     ucMB[i][j] =GetBValue(Image1->Canvas->Pixels[i][j]);
    }

顯示的部分:
if (Image1->Picture->Bitmap->Empty!=true) //因為如果還沒有讀到圖.滑鼠就到image的範
 {                   //圍會出錯.拿這if 來做預防
  Form1->Label1->Caption=AnsiString(ucMR[X][Y]);//X,Y為滑鼠移動在image上的位置
  Form1->Label2->Caption=AnsiString(ucMG[X][Y]);
  Form1->Label3->Caption=AnsiString(ucMB[X][Y]);
 }

心得:
因為之前有修過相關,所以在寫作上比較能容易上手.參考了不少別人寫的程式.看到不同的寫法.多少有些收穫.像是取得圖像的長寬便是從別的程式擷取過來的.基本上是以老師的東西做基礎.剪剪貼貼.不過有玩成一件事總事值得開心的~

沒有留言:

張貼留言