我想了解爲什麼我有麻煩從字節數組創建位圖。我張貼此有關從字節數組位圖創建現有員額的仔細推敲之後,像如下:輸出失配從字節數組創建的位圖
- Creating a bitmap from a byte[],
- Working with Image and Bitmap in c#?,
- C#: Bitmap Creation using bytes array
我的代碼旨在在數字圖像上執行過濾器8bppIndexed將字節[]緩衝區上的像素值寫入以在8Bpp指定位圖中再次進行轉換(經過一些處理以管理灰度級)
我的輸入圖像是通過具體的perl代碼裝置產生一個微不足道的圖像:在執行濾波器輸出圖像已經失去了第一行和最後一行以及第一和最後一列之後
當然, ,由於過濾器管理邊界的方式,所以從原始的256 x 256圖像我得到一個254 x 254圖像。
只是把注意力集中在我評論過負責執行過濾器代碼中的問題,使真正執行的操作是顯而易見的:
ComputedPixel = InputImage.GetPixel(myColumn, myRow).R;
我知道,我應該使用的鎖定和解鎖,但我更喜歡一個一個頭痛。反正這個代碼應該是一種身份的變換,最後我用:
private unsafe void FillOutputImage()
{
OutputImage = new Bitmap (OutputImageCols, OutputImageRows, PixelFormat .Format8bppIndexed);
ColorPalette ncp = OutputImage.Palette;
for (int i = 0; i < 256; i++)
ncp.Entries[i] = Color .FromArgb(255, i, i, i);
OutputImage.Palette = ncp;
Rectangle area = new Rectangle(0, 0, OutputImageCols, OutputImageRows);
var data = OutputImage.LockBits(area, ImageLockMode.WriteOnly, OutputImage.PixelFormat);
Marshal.Copy(byteBuffer, 0, data.Scan0, byteBuffer.Length);
OutputImage.UnlockBits(data);
}
輸出的圖像,我得到如下:
這是很清楚,我失去每行像素,但我不明白爲什麼:
- 我已經仔細地控制所有的參數:
OutputImageCols
,OutputImageRows
和byte[] byteBuffer
甚至寫入已知值作爲測試的方式。 - 該代碼與在StackOverflow和其他地方發佈的其他代碼幾乎相同。
有人可能可以幫助確定問題出在哪裏?
您忽略了BitmapData.Stride。如果掃描行中的字節數不能被4整除,你會得到這種效果。 –
我應該如何管理跨步?在字節數組中寫入值以便行在四個字節邊界上對齊? – Daniel