2 回答
TA贡献1818条经验 获得超7个赞
所以问题出在流中,由 Graphics.FromImage 使用。文档说,从 Graphics.FromImage 打开的流必须在整个使用图像的过程中保持打开状态。好的,我们可以使用 MemoryStream:
MemoryStream ms;
private void button1_Click(object sender, EventArgs e)
{
ms = new MemoryStream();
using (FileStream stream = File.OpenRead(FullName))
{
stream.CopyTo(ms);
pictureBox1.Image = Bitmap.FromStream(ms);
}
}
private void button2_Click(object sender, EventArgs e)
{
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
g.Clear(Color.FromArgb(0, 255, 255, 255));
}
}
并且 image.Clone() 需要删除,因为流必须具有对同一图像的引用,而不是对其副本的正确工作。(说实话,这个简单的程序可以在没有 MemoryStream 的情况下工作)
TA贡献1840条经验 获得超5个赞
您有 3 种选择:
1) 在不克隆的情况下分配Image.FromStream()结果:PictureBox 控件更喜欢在底层流上自行操作(请参阅有关 PictureBox.Load() 方法的 .Net Source)。
private void button1_Click(object sender, EventArgs e)
{
using (FileStream stream = File.OpenRead(FullName))
{
pictureBox1.Image = Bitmap.FromStream(stream);
}
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
g.Clear(Color.FromArgb(0, 255, 255, 255));
}
}
2) 执行 using 块内的所有操作。此时流仍然有效:
using (FileStream stream = File.OpenRead(FullName)
{
pictureBox1.Image = (Image)Image.FromStream(stream).Clone();
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
g.Clear(Color.FromArgb(0, 255, 255, 255));
}
}
3) 直接使用Load()方法。
pictureBox1.Load(FullName);
所有方法最终都将使用 PictureBox 控件内部的InstallNewImage()(.Net 源)方法。看看如何stream处理图像。
调用Graphics.FromImage()将不再引发异常。
- 2 回答
- 0 关注
- 720 浏览
添加回答
举报