Gdiplus - освобождение ресурсов GDI - C#
Формулировка задачи:
Каким образом в gduplus в C# освобождать дескрипторы?! В C++ (без .net) вызывал просто функцию DeleteObject. Здесь как быть - не понятно.
Кусок кода
Введение переменной bmp_temp никакого значения не играет. Память на каждой итерации заполняется как раз на тот самый промежуточный битмап, который создается для image. Метод Dispose() очевидно, удаляет только те структуры, которые выделены программой. Все же, что выделено системой под этот битмап - остается в памяти. И дескрипторы, соответственно, тоже.
Функцию DeleteObject не нашел в пространствах имен. Импортом ее брать как-то странно. Все же должны стандартные пространства имен поддерживать освобождение ресурсов GDI.
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()); }
забыл уточнить:
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"); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д