none
Bitmap的複製,使用new bitmap與Clone的差異 RRS feed

  • 問題

  • 各位好,以下問題請教,謝謝

    我在連續做CheckImage()更新imgSrc時,然後再使用其他函式使用imgSrc時常遇到,為什麼常遇到點陣圖區域已經鎖定?

    class showImage

    {

    Bitmap imgSrc=new new Bitmap(W, H, PixelFormat.Format24bppRgb);

    void CheckImage(Bitmap src) { if (imgSrc.Size != src.Size || imgSrc.PixelFormat != src.PixelFormat) { if (imgSrc != null) imgSrc.Dispose(); imgSrc = (Bitmap)src.Clone(); double rx = (double)imgSrc.Width / Image.Width; double ry = (double)imgSrc.Height / Image.Height; } else { if (imgSrc != null) imgSrc.Dispose(); imgSrc = (Bitmap)src.Clone(); } }

    }

    如果把

    imgSrc = (Bitmap)src.Clone();

    改成

    imgSrc = new Bitmap(src);

    則會造成畫面較鈍,我查了一下兩者的功能只差在Clone是共享src的資源,new Bitmap則是創立一個新的

    想請問各位這兩者差異到底為何?

    2019年1月19日 上午 09:04

解答

  • 如果是 imgSrc = new Bitmap(src); 會呼叫 Graphics.DrawImage 重新繪製一次

    如果是 imgSrc = (Bitmap)src.Clone();,他只會把 src 內部的 image 位址丟給 imgSrc


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2019年1月19日 上午 11:54
    版主
  • Clone 只會複製物件本身,物件被參照的部分不會複製。

    Bitmap 的實體資料區是遠程參照,所以不會被複製到。

    例如以公文來說,你可以把遠程參照當成附件。

    主文件複製一份,主文件裡面可能會有段落要求參照附件。所以做 Clone 後,就是主文件有兩份,附件只有一份,所以當附件被更改時,參照的主文件都是看到最新更改後的附件。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 魏高個 2019年1月22日 上午 02:07
    2019年1月20日 上午 10:09

所有回覆

  • 如果是 imgSrc = new Bitmap(src); 會呼叫 Graphics.DrawImage 重新繪製一次

    如果是 imgSrc = (Bitmap)src.Clone();,他只會把 src 內部的 image 位址丟給 imgSrc


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2019年1月19日 上午 11:54
    版主
  • Clone 只會複製物件本身,物件被參照的部分不會複製。

    Bitmap 的實體資料區是遠程參照,所以不會被複製到。

    例如以公文來說,你可以把遠程參照當成附件。

    主文件複製一份,主文件裡面可能會有段落要求參照附件。所以做 Clone 後,就是主文件有兩份,附件只有一份,所以當附件被更改時,參照的主文件都是看到最新更改後的附件。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 魏高個 2019年1月22日 上午 02:07
    2019年1月20日 上午 10:09
  • 感謝Bill的回覆

    2019年1月22日 上午 02:07
  • 感謝心冷熱情熄的回覆
    2019年1月22日 上午 02:08