Утечка памяти при загрузке изображений с C #

Автоматический способ:

foo.plot <- function(x,y,...) {
    lnames <- names(formals(legend))
    pnames <- c(names(formals(plot.default)), names(par()))
    dots <- list(...)
    do.call('plot', c(list(x = x, y = x), dots[names(dots) %in% pnames]))
    do.call('legend', c("bottomleft", "bar", pch = 1, dots[names(dots) %in% lnames]))
}

pch должен быть отфильтрован из lnames, чтобы избежать дублирования в вызове legend в случае, если пользователь поставляет «pch», но вы получили эту идею. Edited Jan 2012 от Carl W: «do.call» работает только с функциями в кавычках, как в обновлениях Henrik. Я отредактировал его здесь, чтобы избежать путаницы в будущем.

10
задан stiank81 11 November 2009 в 12:18
поделиться

3 ответа

Когда вы вызываете

bmp.GetHbitmap()

a копия растрового изображения создается. Вам нужно будет сохранить ссылку на указатель на этот объект и вызвать для него

DeleteObject(...)

.

Из здесь :

Замечания

Вы несете ответственность за вызов GDI DeleteObject, чтобы освободить память, используемая объектом растрового изображения GDI.


Вы можете избавить себя от головной боли (и накладных расходов), связанной с копированием растрового изображения, используя BitmapImage вместо BitmapSource. Это позволяет загружать и создавать за один шаг.

13
ответ дан 3 December 2019 в 16:29
поделиться

Вам необходимо вызвать метод GDI DeleteObject для указателя IntPtr , возвращаемого из GetHBitmap (). IntPtr , возвращаемый методом, является указателем на копию объекта в памяти. Его необходимо освободить вручную с помощью следующего кода:

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

private static BitmapSource LoadImage(string path)
{

    BitmapSource source;
    using (var bmp = new Bitmap(path))
    {

        IntPtr hbmp = bmp.GetHbitmap();
        source = Imaging.CreateBitmapSourceFromHBitmap(
            hbmp,
            IntPtr.Zero,
            Int32Rect.Empty,
            BitmapSizeOptions.FromEmptyOptions());

        DeleteObject(hbmp);

    }

    return source;
}
7
ответ дан 3 December 2019 в 16:29
поделиться

Кажется, что когда вы вызываете GetHBitmap (), вы отвечаете за освобождение объекта

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

private void DoGetHbitmap() 
{
    Bitmap bm = new Bitmap("Image.jpg");
    IntPtr hBitmap = bm.GetHbitmap();

    DeleteObject(hBitmap);
}

Я предполагаю, что BitmapSource не не беру на себя ответственность за освобождение этого объекта.

5
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: