2012-12-30 53 views
3

我想從原始字節創建一個位圖對象,我的PixelFormatRGB,每個樣本8位,每個像素3個字節。現在爲此我的stide將是寬度的3倍。從原始字節創建位圖對象

Bitmap類一直在尋找4的倍數值作爲步幅值。請幫我解決這個問題。如果我給4乘數的圖像不正確。

Bitmap im = new Bitmap(MyOBJ.PixelData.Columns, MyOBJ.PixelData.Rows, (MyOBJ.PixelData.Columns*3), 
System.Drawing.Imaging.PixelFormat.Format24bppRgb, Marshal.UnsafeAddrOfPinnedArrayElement(images[imageIndex], 0)); 
+0

那麼,至少通過使用圖像的寬度爲4的倍數,使得步幅不要緊測試它。一旦檢出,您需要通過使用LockBits並一次複製一行來修復不兼容性。 –

+1

對於24位的Bitmap,步幅必須是4字節的倍數,如您所述。 因此,對於24位位圖,步幅爲 stride =(((width * 3)+ 3)/ 4)* 4 您當然必須確保您的原始數據也使用最後所需的任何填充每行 – Dampsquid

回答

5

我寫了一個簡短的樣本的陣列的每一行,以使其適應所需的格式,將墊。它將創建一個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; 
} 
+0

非常感謝您的完美工作。 – user1935868

+0

@Eve我有一個關於邁步的問題,我想。我用你的解決方案,但我的顏色不是很好。我的圖片8bit,256bppi。我將PixelFormat更改爲'Format8bppIndexed'。但我無法管理Stride。你可以幫我嗎 ? – goGud