C#图像通过Memorystream错误(但只是第二次通过)

时间:2017-05-16 15:07:33

标签: arrays image gdi+

我需要能够将Image转换为字节数组然后再返回。我已经关注谷歌搜索结果了,它似乎正在运作......除非它没有:)

我很确定它与内存流有关(我得到了GDI +错误),但我使用"使用"我以为自己是在清理过来的。

private void button1_Click(object sender, EventArgs e)
    {
        System.Drawing.Image myImage = null;
        SetImage(ref myImage);  //This one works
        SetImage(ref myImage);  // This call breaks on 
                                //the first myImage.Save line
    }


    private void SetImage(ref System.Drawing.Image myImage)
    {
        try
        {
            byte[] myImageAsBytes = null;

            //First time through we don't have an image already so we load from a file
            if (myImage == null)
            {
                myImage = System.Drawing.Image.FromFile("C:\\temp\\test.jpg");
            }


            //Convert our Image to a Byte Array.
            using (System.IO.MemoryStream myMemoryStream = new System.IO.MemoryStream())
            {
                myImage.Save(myMemoryStream, myImage.RawFormat);
                myImageAsBytes = myMemoryStream.ToArray();
            }

            //Just debugging
            myImage.Dispose();
            myImage = null;
            GC.Collect();


            //And convert it back to an image.
            //using (System.IO.MemoryStream myMemoryStream = new System.IO.MemoryStream(myImageAsBytes))
            //{
            //    myImage = System.Drawing.Image.FromStream(myMemoryStream);
            //}
           System.IO.MemoryStream myMemoryStream2 = new System.IO.MemoryStream(myImageAsBytes);
          myImage = System.Drawing.Image.FromStream(myMemoryStream2);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

3 个答案:

答案 0 :(得分:0)

我知道delphi而不是C ++。如果myimage是一个对象,我认为你已经将myimage设置为null,所以试图重新创建。或者不要将其设置为null,只需重绘它或myimage.loadfromstream。

System.Drawing.Image myImage = null;
        SetImage(ref myImage);  //This one works
        myimage  :=create;
        SetImage(ref myImage);

答案 1 :(得分:0)

Image.FromStream的文档:https://msdn.microsoft.com/en-us/library/93z9ee4x(v=vs.110).aspx

表示:

  

您必须在图像的生命周期内保持流打开。

说到MemoryStreams,关闭/处理它们实际上没有意义。它是唯一可以想到的.NET类,即IDisposable,它不需要处理。它意外地从System.IO.Stream继承了IDisposable,这就是原因。

所以我建议您只创建内存流并让它们成为。

但是,如果您要在物理文件上使用Image.FromStream,可能您不想保持打开状态。在这种情况下你可以做的是像这样制作位图的副本:

Bitmap safeBitmap;
using ( var stream = blah-blah-blah )
using ( var img = Image.FromStream(stream) )
  safeBitmap = new Bitmap(img);

答案 2 :(得分:0)

就像从任何地方删除“ref”一样简单

我建议你阅读关键词所做的事情,然后你就会明白为什么要破坏它。

而是从方法中返回新图像。

即。将其从void更改为返回新图像。

<强>更新

下面是您的代码的控制台版本,基本上没有修改 它运行良好....虽然我不同意所有的编程。 如果点似乎运行没有错误,那么点就是你得到错误

class Program
{
    static  void Main(string[] args)
    {
        Dosomething();
    }


    private static void Dosomething()
    {
        System.Drawing.Image myImage = null;
        SetImage(ref myImage);  //This one works
        SetImage(ref myImage);  // This call breaks on 
    }


    private static void SetImage(ref System.Drawing.Image myImage)
    {
        try
        {
            byte[] myImageAsBytes = null;

            //First time through we don't have an image already so we load from a file
            if (myImage == null)
            {
                myImage = System.Drawing.Image.FromFile("C:\\temp\\test.jpg");
            }


            //Convert our Image to a Byte Array.
            using (System.IO.MemoryStream myMemoryStream = new System.IO.MemoryStream())
            {
                myImage.Save(myMemoryStream, myImage.RawFormat);
                myImageAsBytes = myMemoryStream.ToArray();
            }

            //Just debugging
            myImage.Dispose();
            myImage = null;
            GC.Collect();


            //And convert it back to an image.
            //using (System.IO.MemoryStream myMemoryStream = new System.IO.MemoryStream(myImageAsBytes))
            //{
            //    myImage = System.Drawing.Image.FromStream(myMemoryStream);
            //}
            System.IO.MemoryStream myMemoryStream2 = new System.IO.MemoryStream(myImageAsBytes);
            myImage = System.Drawing.Image.FromStream(myMemoryStream2);
        }
        catch (Exception ex)
        {

        }

    }

}