2013-03-31 60 views
3

我只需要獲取原始位圖數據(無標題或其他信息)。我用下面的代碼來獲取位圖數據:轉換爲Base64時從字節數組中獲得了反轉圖像

using (Bitmap bitmap = svgDocument.Draw()) 
{ 
    Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); 
    BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat); 
    var length = Math.Abs(bitmapData.Stride) * bitmapData.Height; 

    byte[] bytes = new byte[length]; 
    Marshal.Copy(bitmapData.Scan0, bytes, 0, length); 
    bitmap.UnlockBits(bitmapData); 

    MemoryStream memoryStream = new MemoryStream(); 
    string filename = DateTime.Now.Ticks.ToString() + ".bmp"; // this works fine 
    bitmap.Save(filename, ImageFormat.Bmp); 

    string base64 = Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks); // the base64 is reversed. 
} 

當我保存位圖時,一切都看起來很好。圖像不會顛倒。但是,當我僅使用字節將數據轉換爲Base64時,圖像反轉。

編輯1:

我覺得這無關與Base64的轉換。看起來這些字節是相反的順序。

當我使用的代碼保存圖像時,圖像看起來是這樣的:

enter image description here

當我使用的字節數,然後我看到:

enter image description here

解決方案:

我找到了解決方案。我沒有創建一個新的位圖,而是跳過頭部信息的前54個字節,然後存儲字節數組。

MemoryStream memoryStream = new MemoryStream(); 
bitmap.Save(memoryStream, ImageFormat.Bmp); 

// Skip header 
IEnumerable<byte> bytes = memoryStream.ToArray().Skip(54); 
+0

「顛倒」是什麼意思?你能給出一個'bytes'的內容和由此產生的'base64'的例子嗎?你確定這不僅僅是你在第二種情況下保存'bmp'文件的問題嗎? – Mic

+0

@Mic:請參閱我的編輯 – vikasde

+0

好吧,「代碼」和「字節」是什麼意思?兩種情況下你使用的代碼是什麼? – Mic

回答

0

我找到了解決方案。我沒有創建一個新的位圖,而是跳過頭部信息的前54個字節,然後存儲字節數組。

MemoryStream memoryStream = new MemoryStream(); 
bitmap.Save(memoryStream, ImageFormat.Bmp); 

// Skip header 
IEnumerable<byte> bytes = memoryStream.ToArray().Skip(54); 
0

標準BMP格式允許以經典的上/下順序或以相反的順序存儲圖像的字節。

的方式告訴你的形象是否存儲這種方式是檢查在BMP頭的Height參數的值:

  • 如果Height < 0,那麼你的形象的高度爲abs(Height)和像素以反向(底部/頂部)順序存儲。

  • 如果Height > 0,那麼你是在你期望的情況下,其中像素是'正常'的順序,從上到下。

我會說,會發生什麼你的情況是,你是從存儲具有負Height頭的圖像開始(在SVG對象必須做的,由於某種原因)。但是你不檢查它,所以你按照從下到上的順序存儲像素。

當您使用BMP對象進行存儲時,它會從上下文中爲您計算出結果。但是,如果僅導出像素,則加載圖像的第三方應用程序會看到正面的Height,從而顯示圖像上下顛倒。

您可以在Wikipedia page for BMP file format中找到有關此像素排序的詳細信息。

編輯:

所以,當你寫一個BMP文件到您的磁盤,你必須做到以下幾點:

  1. 檢查你的字節是否在從上到下依次是(一)或在底部到頂部順序(b)中

  2. 若(a):把你的圖像的height作爲正值在BMP頭

  3. 如果(b):將- height作爲負值存入BMP頭部。這樣,顯示你的圖像的第三方程序就知道它是相反的。

+0

如果bmp以相反順序存儲,我該怎麼辦?我可以把它放回正確的順序嗎? – vikasde

+0

我檢查了bitmap.Height及其> 0。 – vikasde

+0

你只需要寫出最終的BMP,其高度與你寫的字節順序相匹配。 – Mic