2013-03-31 42 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