我寫了一個簡短的樣本的陣列的每一行,以使其適應所需的格式,將墊。它將創建一個2x2檢查板位圖。
byte[] bytes =
{
255, 255, 255,
0, 0, 0,
0, 0, 0,
255, 255, 255,
};
var columns = 2;
var rows = 2;
var stride = columns*4;
var newbytes = PadLines(bytes, rows, columns);
var im = new Bitmap(columns, rows, stride,
PixelFormat.Format24bppRgb,
Marshal.UnsafeAddrOfPinnedArrayElement(newbytes, 0));
PadLines
方法寫在下面。我試圖通過使用Buffer.BlockCopy
來優化它,以防您的位圖很大。
static byte[] PadLines(byte[] bytes, int rows, int columns)
{
//The old and new offsets could be passed through parameters,
//but I hardcoded them here as a sample.
var currentStride = columns*3;
var newStride = columns*4;
var newBytes = new byte[newStride*rows];
for (var i = 0; i < rows; i++)
Buffer.BlockCopy(bytes, currentStride*i, newBytes, newStride * i, currentStride);
return newBytes;
}
來源
2012-12-30 17:31:03
Mir
那麼,至少通過使用圖像的寬度爲4的倍數,使得步幅不要緊測試它。一旦檢出,您需要通過使用LockBits並一次複製一行來修復不兼容性。 –
對於24位的Bitmap,步幅必須是4字節的倍數,如您所述。 因此,對於24位位圖,步幅爲 stride =(((width * 3)+ 3)/ 4)* 4 您當然必須確保您的原始數據也使用最後所需的任何填充每行 – Dampsquid