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 關注
- 801 瀏覽
添加回答
舉報