[問題] 請教LockBits問題

看板C_and_CPP作者 (雲伴風 風隨雲)時間14年前 (2009/11/19 20:11), 編輯推噓0(003)
留言3則, 2人參與, 最新討論串1/2 (看更多)
最近為了要加快影像處理的速度,所以到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

11/19 21:43, , 1F
你直接對BitmapData的指標作就好 別複製來複製去的
11/19 21:43, 1F

11/19 21:48, , 2F
bmpData->Scan0.ToPointer()
11/19 21:48, 2F

11/19 21:51, , 3F
抱歉,還是看不太懂
11/19 21:51, 3F
文章代碼(AID): #1B1JNSEk (C_and_CPP)
文章代碼(AID): #1B1JNSEk (C_and_CPP)