1
我正在從一個1bpp索引圖像剪切並粘貼到新圖像。Lockbits跨越1bpp索引圖像字節邊界
所有的效果都很好,直到起始像素是8的除數。在下面的代碼中,stride等於相對於矩形寬度的值,直到達到字節邊界。然後步幅等於整個頁面的寬度。
var croppedRect = new Rectangle((int)left, (int)top, (int)width, (int)height);
BitmapData croppedSource = _bitmapImage.LockBits(croppedRect, ImageLockMode.ReadWrite, BitmapImage.PixelFormat);
int stride = croppedSource.Stride;
這是一個問題,因爲不是我的選擇區域粘貼到新的圖像,元帥副本的橫截面,選定區域的高度,頁面的整個寬度的。
int numBytes = stride * (int)height;
var srcData = new byte[numBytes];
Marshal.Copy(croppedSource.Scan0, srcData, 0, numBytes);
Marshal.Copy(srcData, 0, croppedDest.Scan0, numBytes);
destBmp.UnlockBits(croppedDest);
爲什麼這是一個問題? GDI +使用* croppedRect *來優化像素內存映射。有時候可以。只需使用返回的步幅來索引位圖中的掃描線。 – 2012-04-06 15:14:40
漢斯,看我的編輯。 – strattonn 2012-04-06 16:19:22
是的,那是行不通的。它不像裁剪區域。您一次只能複製不超過* width *位,因此您需要一個循環來索引掃描線。由於您正在訪問* croppedRect *以外的字節,因此您的原始代碼也會拋出AccessViolation的可能性很高。如果左和/或左+寬度不是8的倍數,則需要特別處理一行的第一個和最後一個字節。 – 2012-04-06 16:23:45