2012-09-12 35 views
2

我想了解爲什麼我有麻煩從字節數組創建位圖。我張貼此有關從字節數組位圖創建現有員額的仔細推敲之後,像如下:輸出失配從字節數組創建的位圖

我的代碼旨在在數字圖像上執行過濾器8bppIndexed將字節[]緩衝區上的像素值寫入以在8Bpp指定位圖中再次進行轉換(經過一些處理以管理灰度級)

我的輸入圖像是通過具體的perl代碼裝置產生一個微不足道的圖像:在執行濾波器輸出圖像已經失去了第一行和最後一行以及第一和最後一列之後

input image

當然, ,由於過濾器管理邊界的方式,所以從原始的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);   
} 

輸出的圖像,我得到如下:

output image

這是很清楚,我失去每行像素,但我不明白爲什麼:

  1. 我已經仔細地控制所有的參數:OutputImageColsOutputImageRowsbyte[] byteBuffer甚至寫入已知值作爲測試的方式。
  2. 該代碼與在StackOverflow和其他地方發佈的其他代碼幾乎相同。

有人可能可以幫助確定問題出在哪裏?

+2

您忽略了BitmapData.Stride。如果掃描行中的字節數不能被4整除,你會得到這種效果。 –

+1

我應該如何管理跨步?在字節數組中寫入值以便行在四個字節邊界上對齊? – Daniel

回答

0

答案是不正確的,真正的答案來自Hans Passant,它給了我觸發解決方案的提示(感謝那個,漢斯)。我關閉答案只是提供一個簡單的細節,以防萬一有人感興趣:而不是處理一個緩衝區,然後通過Marshal.Copy複製它,處理不同緩衝區上的4字節對齊問題,並使用更多內存比嚴格要求的,我只是使用LockBits直接在圖像數據上工作,使用已經設置的操作數據結構。這是我在漢斯編輯的問題中想到的另一種選擇;我知道我的問題不幸地沒有明確說明。無論如何,現在一切正常。