【问题标题】:Bitmap.Save vs File.WriteAllBytesBitmap.Save 与 File.WriteAllBytes
【发布时间】:2014-03-18 17:11:04
【问题描述】:

我有一个字节数组 (imgBuffer),其中包含 jpeg 图像的 rgb 值。我想将此保存到位图。当我使用System.IO.File.WriteAllBytes("fileImg.jpg", imgBuffer); 时,我能够以正确的格式在我的目录中看到图像。当我尝试将相同的字节数组 imgBuffer 写入位图对象时,图像会损坏。 (图片格式为24bpp,320x240)

BitmapData data;
Bitmap myBitmap = new Bitmap(320, 240, PixelFormat.Format24bppRgb);
//convert bytes to a bitmap
data = myBitmap .LockBits(new Rectangle(Point.Empty, bitmapResized.Size), ImageLockMode.WriteOnly,
                                  PixelFormat.Format24bppRgb);
Marshal.Copy(imgBuffer, 0, data.Scan0, imgBuffer.Length);
myBitmap .UnlockBits(data);
myBitmap .Save("bitmapImg.jpg");

我必须更改哪些内容才能将 bitmapImg 正确输出到我的目录?我目前收到以下损坏的图像。

【问题讨论】:

    标签: c# file graphics bitmap


    【解决方案1】:

    如果您可以将 imgBuffer 字节数组保存到磁盘并在图像查看器中以 JPEG 格式读取,那么它不是图像的原始 RGB 值。

    您可以从流中加载Bitmap 并将imgBuffer 中的数据用作您的源,您将得到一个可以使用的Bitmap 对象。

    【讨论】:

    • 解决了问题!我猜我的imgBuffer包含一些我不知道的标题数据。谢谢大卫
    【解决方案2】:

    我认为这里的问题是Bitmap 代码假定数据是位图格式。 Save 方法首先将其转换为 jpg,然后将其保存。在这种情况下,它已经是 jpg 格式,因此将 jpg 转换为 jpg 会损坏图像。在File.WriteAllBytes 方法中,它只是直接保存,因此没有损坏

    【讨论】:

    • 我也尝试使用myBitmap.Save("bitmapImg.jpg", ImageFormat.Jpeg) 保存位图,但仍然收到损坏的图像。实际上,图像尺寸甚至比以前更小。我假设它无法识别我的字节顺序,因此重新编码并将位再次压缩为 jpeg。
    猜你喜欢
    • 1970-01-01
    • 2013-05-20
    • 2013-02-16
    • 2012-11-14
    • 2013-07-23
    • 2022-01-22
    • 1970-01-01
    • 2015-02-23
    • 2023-04-07
    相关资源
    最近更新 更多