我正在使用第三方DLL,它具有作爲參數的RGB緩衝區。C# - 與C++不同的位圖的RGB緩衝區
我已經使用下面的代碼來從Bitmap
讀取RGB緩衝液:
private byte[] GetBGRValues(Bitmap bmp)
{
// Lock the bitmap's bits.
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;
// Declare an array to hold the bytes of the bitmap.
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] rgbValues = new byte[bytes];
// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
bmp.UnlockBits(bmpData);
return rgbValues;
}
的問題是,所生成的RGB緩衝器是不正確的。如果我在IrfanView中打開這個緩衝區,提供正確的參數,生成的圖像不正確(看起來像它被移動)。
如果得到一個我用C++代碼讀取的緩衝區,它就可以工作。
我注意到bmpData.Stride
比我預期的要大1個單位(width
* channels
)。 (我知道.NET使用4個字節對齊)。
問題是:爲什麼RGB緩衝區不正確?
* ...爲什麼RGB緩衝區不正確?*。 rgb緩衝區是正確的。 *(我知道 。NET使用4字節對齊方式)*。它不是使用4字節對齊的.net。它自己使用它的圖像。 C++或.net提供了相同的緩衝區。不要急於下結論。 – 2014-10-02 22:21:13
我給這個方法提供的位圖是24bpp,並且width = 897,height = 1281.爲什麼stride的值是2692而不是2691?如果我將生成的緩衝區保存到文件並在IrfanView上打開,則圖像不正確。爲什麼? – user1862876 2014-10-02 23:32:59
您沒有訪問僅包含像素的緩衝區,您正在訪問針對快速訪問進行了優化的圖像的內存中表示,但兩者不同。正如你所觀察到的,內存中的表示將會優化alighment和類似的,這意味着跨度可以大於圖像寬度。換句話說,如果之後嘗試將該字節數組解釋爲897 * 1281的3字節像素集,則會遇到問題。 – 2016-11-01 08:52:09