【问题标题】:Difficulty Saving Image To MemoryStream难以将图像保存到 MemoryStream
【发布时间】:2016-10-06 08:24:56
【问题描述】:

我在将字节流从图像(在本例中为 jpg)保存到 System.IO.MemoryStream 对象时遇到了一些困难。目标是将System.Drawing.Image 保存到MemoryStream,然后使用MemoryStream 将图像写入字节数组(我最终需要将其插入数据库)。但是,在 MemoryStream 关闭后检查变量 data 表明所有字节都为零......我很困惑,不知道我做错了什么......

using (Image image = Image.FromFile(filename))
{
    byte[] data;

    using (MemoryStream m = new MemoryStream())
    {
        image.Save(m, image.RawFormat);
        data = new byte[m.Length];
        m.Write(data, 0, data.Length);
    }

    // Inspecting data here shows the array to be filled with zeros...
}

任何见解都将不胜感激!

【问题讨论】:

    标签: c# image stream


    【解决方案1】:

    要将流中的数据加载到数组中,您读取,而不是写入(并且您需要倒带)。但是,在这种情况下更简单,ToArray():

    using (MemoryStream m = new MemoryStream())
    {
        image.Save(m, image.RawFormat);
        data = m.ToArray();
    }
    

    【讨论】:

    • 酷,到目前为止,我一直误解有关流的读写。谢谢!
    【解决方案2】:

    如果目的是将图像字节保存到数据库中,您可以这样做:

    byte[] imgData = System.IO.File.ReadAllBytes(@"path/to/image.extension");
    

    然后插入您的数据库逻辑以保存字节。

    【讨论】:

    • 谢谢,我实际上只是使用本地电脑上的一个文件来隔离我遇到的问题。在我正在使用的应用程序中,图像实际上是以字节数组的形式出现的。我正在尝试实例化一个 Image 类以在将其保存到数据库之前进行一些处理。很高兴了解 ReadAllBytes!谢谢!
    【解决方案3】:

    几秒钟前我发现这篇文章的另一个原因,也许你会发现它很有用: http://www.codeproject.com/KB/recipes/ImageConverter.aspx

    基本上我不明白您为什么要尝试在具有图像的内存流上写入一个空数组。这是你清理图像的方式吗?

    如果不是这样,请使用 ToArray 方法读取您在内存流中写入的内容并将其分配给您的字节数组

    仅此而已

    【讨论】:

    • 感谢您的链接。我实际上是在尝试对上传到网站的图像进行一些处理,然后再将其保存到数据库中。我猜 System.Drawing.Image 命名空间有一些调整大小的功能,所以我使用的是 Image 类。
    • 是的,绝对是个好主意。那是您应该搜索的正确位置。关心性能,Image 类很容易消耗大量内存(这就是让我在当前项目中抓狂的原因)
    【解决方案4】:

    试试这个方法,对我有用

                    MemoryStream ms = new MemoryStream();
                    Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
                    panel1.DrawToBitmap(bmp, panel1.Bounds);
                    bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                    byte[] Pic_arr = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(Pic_arr, 0, Pic_arr.Length);
                    ms.Close();
    

    我使用面板控件而不是图像控件。

    【讨论】:

      猜你喜欢
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多