Автоматический способ:
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. Я отредактировал его здесь, чтобы избежать путаницы в будущем.
Когда вы вызываете
bmp.GetHbitmap()
a копия растрового изображения создается. Вам нужно будет сохранить ссылку на указатель на этот объект и вызвать для него
DeleteObject(...)
.
Из здесь :
Замечания
Вы несете ответственность за вызов GDI DeleteObject, чтобы освободить память, используемая объектом растрового изображения GDI.
Вы можете избавить себя от головной боли (и накладных расходов), связанной с копированием растрового изображения, используя BitmapImage вместо BitmapSource. Это позволяет загружать и создавать за один шаг.
Вам необходимо вызвать метод 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;
}
Кажется, что когда вы вызываете 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 не не беру на себя ответственность за освобождение этого объекта.