亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用Graphics時圖片內存不足,C#

使用Graphics時圖片內存不足,C#

C#
千巷貓影 2022-06-12 15:25:31
代碼很簡單:我按下按鈕,圖片被加載到PictureBox中。    private void button1_Click(object sender, EventArgs e){        using (FileStream stream = File.OpenRead(FullName))        {            pictureBox1.Image = (Bitmap)Bitmap.FromStream(stream).Clone();            stream.Close();            stream.Dispose();        }}但是當我從其他函數\事件中使用 PictureBox'e 上的 Graphics 時,它發誓在 Graphics.FromImage 上沒有足夠的內存。不管我用這個時間表做什么。例子:    using (Graphics g = Graphics.FromImage(pictureBox1.Image)){    g.Clear(Color.FromArgb(0, 255, 255, 255));    pictureBox1.Invalidate();}問題是,為什么我可以在將圖片上傳到 PictureBox 之前對 Graphics 做任何我想做的事情:剪切、填充、繪制;但是上傳圖片后我不能?ps 圖片嘗試了不同的尺寸。同一張圖片在上傳前有效(已經在默認圖片框中),上傳到圖片框后無效。走了很多關于這個主題的論壇,但沒有找到我的案例(或最相似的案例)。
查看完整描述

2 回答

?
qq_笑_17

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 的情況下工作)


查看完整回答
反對 回復 2022-06-12
?
慕斯709654

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()將不再引發異常。


查看完整回答
反對 回復 2022-06-12
  • 2 回答
  • 0 關注
  • 801 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號