Более простым, чем принятый ответ, является следующее:
public static Bitmap cropAtRect(this Bitmap b, Rectangle r)
{
Bitmap nb = new Bitmap(r.Width, r.Height);
Graphics g = Graphics.FromImage(nb);
g.DrawImage(b, -r.X, -r.Y);
return nb;
}
и он избегает исключения « Недостаточно памяти ». Самый простой ответ.
EDIT: Я считаю, что это нормально с PNG, сохраненными с помощью Bitmap.Save
или Paint.exe, но с ошибками с PNG, сохраненными, например, Paint Shop Pro 6 - содержимое смещено. Добавление GraphicsUnit.Pixel
дает другой неправильный результат. Возможно, эти неисправные PNG неисправны.