Gdiplus - освобождение ресурсов GDI - C#

Узнай цену своей работы

Формулировка задачи:

Каким образом в gduplus в C# освобождать дескрипторы?! В C++ (без .net) вызывал просто функцию DeleteObject. Здесь как быть - не понятно. Кусок кода
      public init()
        {
            bmp = new Bitmap(pb.Width, pb.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            pb.Image = null;
        }
 
        unsafe public void fill_bitmap()
        {
            bmp_d = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);

// заполняю битмап.
 
           bmp.UnlockBits(bmp_d);

            if (bmp_temp != null)
            {
                bmp_temp.Dispose();
//                bmp_temp = null;
            }
 
/*
            if (pb.Image != null)
            {
                pb.Image.Dispose();
//                pb.Image = null;
            }
 
            bmp_temp = Image.FromHbitmap(bmp.GetHbitmap());
            pb.Image = bmp_temp;
*/
            pb.Image = Image.FromHbitmap(bmp.GetHbitmap());
 
}
Введение переменной bmp_temp никакого значения не играет. Память на каждой итерации заполняется как раз на тот самый промежуточный битмап, который создается для image. Метод Dispose() очевидно, удаляет только те структуры, которые выделены программой. Все же, что выделено системой под этот битмап - остается в памяти. И дескрипторы, соответственно, тоже. Функцию DeleteObject не нашел в пространствах имен. Импортом ее брать как-то странно. Все же должны стандартные пространства имен поддерживать освобождение ресурсов GDI.
забыл уточнить: init () - вызывается один раз при загрузке fill_bitmap() - на каждой итерации

Решение задачи: «Gdiplus - освобождение ресурсов GDI»

textual
Листинг программы
    class screenshot_analyzer_c
    {
        public void make_screenshot_sample(int use_bitmap_or_image)
        {
            int scr_w = Screen.PrimaryScreen.Bounds.Width;
            int scr_h = Screen.PrimaryScreen.Bounds.Height;
            // prepare source screenshot
            using (Bitmap bmp_src_full_size = new Bitmap(scr_w, scr_h)) //  source screen
            using (Graphics g_full_size = Graphics.FromImage(bmp_src_full_size))
            {
                g_full_size.CopyFromScreen(0, 0, Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
                Rectangle rect_div = new Rectangle(0, 0, scr_w, scr_h);
                if (use_bitmap_or_image == 1)
                    //bitmap
                    using (Bitmap bmp_dst_part_size = bmp_src_full_size.Clone(rect_div, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
                    using (Graphics g_part_size = Graphics.FromImage(bmp_dst_part_size))
                    {
                        g_part_size.DrawImage(bmp_src_full_size, rect_div);
 
                        bmp_dst_part_size.Save("bmp_div_by.png");
                    }
                else
                    //image
                    using (Image img_dst_part_size = Image.FromHbitmap(bmp_src_full_size.GetHbitmap()))
                    using (Graphics g_part_size = Graphics.FromImage(img_dst_part_size))
                    {
                        g_part_size.DrawImage(bmp_src_full_size, rect_div);
                        img_dst_part_size.Save("img_div_by.png");
                    }
            }
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5