Изображение показывает в фоновом режиме после поворота - PullRequest
0 голосов
/ 22 декабря 2018

Я написал функцию, которая вращала изображение, чтобы сделать его быстрым (что действительно важно для поворота сотен фотографий). Я не делал новый растровый рисунок каждый раз, когда поворачиваю изображение.Но это привело к тому, что старая фотография появилась на заднем плане, как я мог это исправить, не создавая новое растровое изображение, которое замедлит все!

    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));
        }
        return img;
    }

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Я не думаю, что это возможно без дополнительного кода.

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 + не будет рисовать полную прозрачность.Вместо этого вам нужно будет

  1. Установить CompositingMode по умолчанию SourceOver на SourceCopy;
  2. Залить очень отчетливым цветом, возможно, не на вашем изображении Fuchsia
  3. Использование MakeTransparent.

graphics.CompositingMode = CompositingMode.SourceCopy;
..
graphics.FillPath(Brushes.Fuchsia, gp);
((Bitmap)img).MakeTransparent(Color.Fuchsia);

Обратите внимание, что не все приложения будут хорошо отображать прозрачность .. Photoshop, конечно, делает ..:

enter image description here

0 голосов
/ 22 декабря 2018

вы можете использовать Graphics Clear () метод

...