private void button1_Click_1(object sender, EventArgs e) {
            Image image1 = pictureBox1.Image;            System.IO.MemoryStream ms = new MemoryStream();
            image1.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] aBytes = ms.GetBuffer();
            ms.Close();            ms = new MemoryStream(aBytes);
            Image image2 = Image.FromStream(ms);
            ms.Close();            System.IO.MemoryStream ms2 = new MemoryStream();
            try {
                image2.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (Exception ex) {
            }
            byte[] bBytes = ms.GetBuffer();
            ms.Close();
        }
将一个Image对象转为byte[],然后再将这个byte[]转为image2
当我将image2再次转为byte[]时(代码中try起来的地方),系统就抛出了异常:
System.Runtime.InteropServices.ExternalException {"GDI+ 中发生一般性错误。"}
ErrorCode = -2147467259不关闭流的话转换就不会出错...但image2,我需要在程序中的其它地方使用。这里难道一直不关闭流?

解决方案 »

  1.   

    直接敲得代码,不保证没问题。        private void button1_Click_1(object sender, EventArgs e) {
                Image image1 = pictureBox1.Image;            System.IO.MemoryStream ms = new MemoryStream();
                image1.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] aBytes = ms.GetBuffer();
                ms.Close();            ms = new MemoryStream(aBytes);
                Image image2 = Image.FromStream(ms);//方法2:Image image2 = (Image)Image.FromStream(ms).Clone();
                ms.Close();//方法1:这里不关闭            System.IO.MemoryStream ms2 = new MemoryStream();
                try {
                    image2.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
                catch (Exception ex) {
                }
                byte[] bBytes = ms.GetBuffer();
                ms.Close();
            }
      

  2.   

                Image image1 = pictureBox1.Image;            System.IO.MemoryStream ms = new MemoryStream();
                image1.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] aBytes = ms.GetBuffer();
                ms.Close();            ms = new MemoryStream(aBytes);
                Image image2 = Image.FromStream(ms);
                ms.Close();            Bitmap bmp = new Bitmap(image2.Width, image2.Height);
                Graphics g = Graphics.FromImage(bmp);
                g.DrawImage(image2, 0, 0);
                System.IO.MemoryStream ms2 = new MemoryStream();
                try
                {
                    bmp.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
                catch (Exception ex)
                {
                }
                byte[] bBytes = ms.GetBuffer();
                ms.Close();
      

  3.   

    对于Image(以及其子类Bitmap)非常特殊,必须这样才不会丢失必要的信息:MemoryStream ms = new MemoryStream();
    new BinaryFormatter().Serialize(ms, image1);
    byte[] aBytes = ms.ToArray();
    ms = new MemoryStream(aBytes);
    Image image2 = (Image)new BinaryFormatter().Deserialize(ms);System.IO.MemoryStream ms2 = new MemoryStream();
    image2.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);
    byte[] bBytes = ms.ToArray();
    ms.Close();这个需要死记的,哈哈!
      

  4.   

    因为你的这一句image2.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);
    没啥意义,我就保留了。可是,这样Save根本不能保存完整的信息!
      

  5.   

    System.IO.MemoryStream ms = new MemoryStream();
    System.IO.MemoryStream ms2 = new MemoryStream();
    你所有的MemoryStream只是这样定义申明,并没有把Image读到ms里面呀。你的代码对吗?
      

  6.   

    public byte[] imageToByteArray(System.Drawing.Image img)
    {
     MemoryStream ms = new MemoryStream();
     img.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
     return  ms.ToArray();
    }public Image byteArrayToImage(byte[] byteArrayIn)
    {
         MemoryStream ms = new MemoryStream(byteArrayIn);
         Image img= Image.FromStream(ms);
         return img;
    }
      

  7.   

    问题出在你的 PictureBox 上,
    由于重绘的需要, PictureBox.Image 的基底流(字节数组的读取器)是不能关闭的关闭导致 picturebox 重绘异常,跟位图本身没关系.
      

  8.   

    上周出差,现在才看到大家的回复。
    我测试了一下,2L的做法不行,
    8L的说法好像也不正确,我试过将PictureBox的Image对象Clone出来,再销毁PictureBox的Image对象,结果转换的时候还是异常。
    4L的方法是可行的。
    谢谢大家的回复!