作者bbbbbbjeff (雲伴風 風隨雲)
看板C_and_CPP
標題[問題] 請教LockBits問題
時間Thu Nov 19 20:11:04 2009
最近為了要加快影像處理的速度,所以到MSDN找
了關於LockBits的用法,但是在取出像素值時出
了點問題,導致我目前連做個RGB互補色轉換的結果
都會怪怪的,我是用VC++ 2008寫的,以下是簡短的code,
是否可以請有經驗的人幫忙看看:
private: System::Void Form1_Load(sender,e)
{
//將pictureBox1內的影像資料給設給bmp
Bitmap^ bmp = gcnew Bitmap(pictureBox1->Image);
//指定要鎖定的影像範圍
Rectangle rect = Rectangle(0,0,bmp->Width,bmp->Height);
//在BitmapData內,再指定記憶體的拴鎖模式與Bitmap的資料格式
Imaging::BitmapData^ bmpData = bmp->LockBits( rect,
Imaging::ImageLockMode::ReadWrite, bmp->PixelFormat );
//以指標取得影像資料的起始位址
IntPtr ptr = bmpData->Scan0;
//計算此bmpData共有多少byte
int bytes = bmpData->Stride * bmp->Height;
//宣告一個一維(8位元不帶正負號的整數)的陣列,用來存下bmp影像的rgb值
array<Byte>^rgbValues = gcnew array<Byte> (bytes);//陣列大小是bytes
//從Unmanaged記憶體指標將資料複製到Unsigned Integer 陣列
Marshal::Copy( ptr, rgbValues, 0, bytes );
//做互補色轉換,
(我是覺得這兩行有問題)
for (int counter=0; counter<rgbValues->Length; counter++)
rgbValues[ counter ] = 255-rgbValues[counter];
//將資料複製到 Unmanaged 記憶體指標
Marshal::Copy( rgbValues, 0, ptr, bytes );
//解開記憶體定
bmp->UnlockBits( bmpData );
//顯示最後結果
pictureBox2->Image=bmp;
}
可以執行,但是pictureBox2跟本沒有東西???
是否取像素值的方式有問題??
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.204.4.92
→ joefaq:你直接對BitmapData的指標作就好 別複製來複製去的 11/19 21:43
→ joefaq:bmpData->Scan0.ToPointer() 11/19 21:48
→ bbbbbbjeff:抱歉,還是看不太懂 11/19 21:51