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,我需要在程序中的其它地方使用。这里难道一直不关闭流?
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();
}
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();
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();这个需要死记的,哈哈!
没啥意义,我就保留了。可是,这样Save根本不能保存完整的信息!
System.IO.MemoryStream ms2 = new MemoryStream();
你所有的MemoryStream只是这样定义申明,并没有把Image读到ms里面呀。你的代码对吗?
{
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;
}
由于重绘的需要, PictureBox.Image 的基底流(字节数组的读取器)是不能关闭的关闭导致 picturebox 重绘异常,跟位图本身没关系.
我测试了一下,2L的做法不行,
8L的说法好像也不正确,我试过将PictureBox的Image对象Clone出来,再销毁PictureBox的Image对象,结果转换的时候还是异常。
4L的方法是可行的。
谢谢大家的回复!