将图像保存到内存流中的困难

24

我在尝试将一个图像的字节流(在此例中,是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...
}

非常感谢任何见解!

4个回答

38

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

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

很酷,直到现在我一直误解了有关流的读写。谢谢! - Andrew

4
如果目的是将图像字节保存到数据库中,可以简单地执行以下操作:
byte[] imgData = System.IO.File.ReadAllBytes(@"path/to/image.extension");

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


谢谢,实际上我只是在使用本地电脑上的文件来隔离我遇到的问题。在我使用的应用程序中,图像实际上是作为字节数组传入的。我正在尝试实例化一个Image类,在保存到数据库之前进行一些处理。很高兴知道ReadAllBytes!谢谢! - Andrew

0

试一下这个方法,对我有效

                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();

我使用了一个面板控件,而不是一个图像控件。


0

我刚刚找到了这篇文章,可能对你有用: http://www.codeproject.com/KB/recipes/ImageConverter.aspx

基本上,我不明白为什么你要在一个包含图像的内存流中写入一个空数组。这是你清理图像的方式吗?

如果不是这种情况,请使用ToArray方法读取你在内存流中编写的内容,并将其分配给你的字节数组。

就是这样。


谢谢提供链接。实际上,我正在尝试在将图像保存到数据库之前对上传到网站的图像进行一些处理。我猜测System.Drawing.Image命名空间具有一些调整大小的功能,因此我正在使用Image类。 - Andrew
是的,绝对是个好主意。那是你应该搜索的正确位置。要注意性能,Image类很容易消耗大量内存(这就是让我在当前项目中感到烦恼的原因)。 - Francesco Belladonna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接