Image与byte[]相互转换时遇到的奇怪问题

thksum 2010-04-01 06:41:44

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,我需要在程序中的其它地方使用。这里难道一直不关闭流?
...全文
431 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
thksum 2010-04-12
  • 打赏
  • 举报
回复
上周出差,现在才看到大家的回复。
我测试了一下,2L的做法不行,
8L的说法好像也不正确,我试过将PictureBox的Image对象Clone出来,再销毁PictureBox的Image对象,结果转换的时候还是异常。
4L的方法是可行的。
谢谢大家的回复!
Dobzhansky 2010-04-01
  • 打赏
  • 举报
回复
问题出在你的 PictureBox 上,
由于重绘的需要, PictureBox.Image 的基底流(字节数组的读取器)是不能关闭的

关闭导致 picturebox 重绘异常,

跟位图本身没关系.
wuyq11 2010-04-01
  • 打赏
  • 举报
回复
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;
}
xray2005 2010-04-01
  • 打赏
  • 举报
回复
System.IO.MemoryStream ms = new MemoryStream();
System.IO.MemoryStream ms2 = new MemoryStream();


你所有的MemoryStream只是这样定义申明,并没有把Image读到ms里面呀。你的代码对吗?
  • 打赏
  • 举报
回复
因为你的这一句
image2.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);
没啥意义,我就保留了。

可是,这样Save根本不能保存完整的信息!
  • 打赏
  • 举报
回复
对于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();


这个需要死记的,哈哈!
  • 打赏
  • 举报
回复
以测试就知道问题了!
xingyuebuyu 2010-04-01
  • 打赏
  • 举报
回复
            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();
aimeast 2010-04-01
  • 打赏
  • 举报
回复
直接敲得代码,不保证没问题。

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

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧