一開始在動態宣告記憶體的地方有點困惑.不過後來老師提醒一下就可以繼續了
程式碼部分.首先讀圖指令:
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]);
}
心得:
因為之前有修過相關,所以在寫作上比較能容易上手.參考了不少別人寫的程式.看到不同的寫法.多少有些收穫.像是取得圖像的長寬便是從別的程式擷取過來的.基本上是以老師的東西做基礎.剪剪貼貼.不過有玩成一件事總事值得開心的~
沒有留言:
張貼留言