Я не думаю, что это возможно без дополнительного кода.
Graphics
- это , связанное с изображением, поэтому рисунок изменит изображение.
Итак, вам нужно иметь второе изображение. Создание пустой (или точной копии) не так медленно ..
Подумайте об этом так: откуда могут появиться старые пиксели, когда вы одновременно меняетеих?Так что вам нужно иметь два буфера.(Но да, внутри уже есть второй буфер, иначе результаты будут еще более странными. Но вы не можете контролировать его использование ..)
Если вы действительно чувствуете необходимость избегать2-е изображение, которое вы можете создать GraphicsPath
или Polygon
, которое покрывает все, кроме повернутого изображения, и залейте его цветом фона ..
Но поскольку поворот изображения потребует больше места для размещения повернутых углов, вам, вероятно, все равно понадобится 2-е большее изображение.
Обновление: Вот пример того, какочистить / обрезать область вне повернутых imgae.Он использует GraphicsPath
, к которому я сначала добавляю огромный, а затем целевой прямоугольник.Таким образом, отверстие вырезается и заполняется только за пределами области:
public static Image RotateImage(Image img, float rotationAngle)
{
using (Graphics graphics = Graphics.FromImage(img))
{
graphics.TranslateTransform((float)img.Width / 2, (float)img.Height / 2);
graphics.RotateTransform(rotationAngle);
graphics.TranslateTransform(-(float)img.Width / 2, -(float)img.Height / 2);
graphics.DrawImage(img, new Point(0, 0));
GraphicsPath gp = new GraphicsPath();
GraphicsUnit gu = GraphicsUnit.Pixel;
gp.AddRectangle(graphics.ClipBounds);
gp.AddRectangle(img.GetBounds(ref gu));
graphics.FillPath(Brushes.White, gp);
}
return img;
}
Обратите внимание, что вы не можете использовать прозрачный кисть как GDI + не будет рисовать полную прозрачность.Вместо этого вам нужно будет
- Установить
CompositingMode
по умолчанию SourceOver
на SourceCopy
; - Залить очень отчетливым цветом, возможно, не на вашем изображении
Fuchsia
- Использование
MakeTransparent
.
graphics.CompositingMode = CompositingMode.SourceCopy;
..
graphics.FillPath(Brushes.Fuchsia, gp);
((Bitmap)img).MakeTransparent(Color.Fuchsia);
Обратите внимание, что не все приложения будут хорошо отображать прозрачность .. Photoshop, конечно, делает ..: