none
Bitmap Copy 參數無效 RRS feed

  • 問題

  • 我使用Thread 定時擷取 WebCam 的影像存入Bitmap   g_NewImage 內

    但是在別的Thread 呼叫複製檔案時會出現參數無效的錯誤

    [code1]

            public Bitmap Get_Image()
            {
                g_NewImage.Save("D:\\1.bmp"); //這樣可以正常執行
                return new Bitmap(g_NewImage);  //這行出現無效參數
            }

    [/code1]

    [code2]

        public Bitmap Get_Image()

            Bitmap newbmp = new Bitmap(g_NewImage.Width, g_NewImage.Height, PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(newbmp);
                g.DrawImage(g_NewImage, 0, 0,
                            new Rectangle(0, 0, g_NewImage.Width, g_NewImage.Height),
                            GraphicsUnit.Pixel); //這行出現無效參數
                g.Dispose();
                return newbmp;

    [/code2]

    可否請教一下要如何處理此問題?

    感謝


    NoWay999

    2016年9月10日 上午 02:05

解答

所有回覆

  • Bitmap類別的物件不支援同時被多個執行緒使用, 程式必須管制Bitmap被多執行緒同時使用的場景, 請參考:

    Threadsafe over Bitmap in C#

    • 已標示為解答 Noway999 2016年9月16日 上午 01:25
    2016年9月10日 上午 03:32
  • 在本論壇 搜尋 委派 執行緒

    就有很多相關討論。


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

    2016年9月10日 下午 01:54
  • 我使用Thread 定時擷取 WebCam 的影像存入Bitmap   g_NewImage 內

    但是在別的Thread 呼叫複製檔案時會出現參數無效的錯誤

    [code1]

            public Bitmap Get_Image()
            {
                g_NewImage.Save("D:\\1.bmp"); //這樣可以正常執行
                return new Bitmap(g_NewImage);  //這行出現無效參數
            }

    [/code1]

    [code2]

        public Bitmap Get_Image()

            Bitmap newbmp = new Bitmap(g_NewImage.Width, g_NewImage.Height, PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(newbmp);
                g.DrawImage(g_NewImage, 0, 0,
                            new Rectangle(0, 0, g_NewImage.Width, g_NewImage.Height),
                            GraphicsUnit.Pixel); //這行出現無效參數
                g.Dispose();
                return newbmp;

    [/code2]

    可否請教一下要如何處理此問題?

    感謝


    NoWay999

    最後測試出來

            public void Get_BmpData(ref Bitmap BmpData)
            {
                // return new Bitmap(source);
                lock ( g_NewImage )
                {
                    BmpData = new Bitmap(g_NewImage);
                };
            }

    只是需要 Lock 物件便可以順利取出資料



    NoWay999

    2016年9月16日 上午 01:26