看板 C_and_CPP 關於我們 聯絡資訊
最近為了要加快影像處理的速度,所以到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