WPF Поворот и возврат BitmapSource под любым углом - PullRequest
2 голосов
/ 12 марта 2019

Привет, я пробовал это:

public static BitmapSource RotateImage(Image b, float angle)
    {
        BitmapSource rotita = (BitmapSource)b.Source;

        DrawingVisual drawingVisual = new DrawingVisual();

        using (DrawingContext drawingContext = drawingVisual.RenderOpen())
        {
            var transform = new RotateTransform(angle);
            drawingContext.PushTransform(transform);
            drawingContext.DrawImage(rotita, new Rect(0,0, rotita.PixelWidth, rotita.PixelHeight));
            drawingContext.Pop();
        }

        RenderTargetBitmap bmp = new RenderTargetBitmap(rotita.PixelWidth, rotita.PixelHeight, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(drawingVisual);

        rotita = bmp;

        return rotita;
    }

Но это не работает нормально. У меня это изображение при 0 градусах и после поворота на 30 градусов это изображение .

Что я мог сделать, чтобы изображение было завершено после поворота?

DrawingVisual drawingVisual = new DrawingVisual();            

        using (DrawingContext drawingContext = drawingVisual.RenderOpen())
        {
            drawingContext.DrawImage(back, new Rect(0, 0, imageWidth, imageHeight));            
            drawingContext.DrawImage(element, new Rect(x,y, elementWidth, elementHeight));
        }

        RenderTargetBitmap bmp = new RenderTargetBitmap(imageWidth, imageHeight, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(drawingVisual);


        image.Source = bmp;

Элемент - это повернутое изображение

1 Ответ

0 голосов
/ 12 марта 2019

Следующий метод создает составное растровое изображение из двух других, где второе вращается вокруг их общей центральной точки.

Две важные части этого метода - вычисление преобразованных границ повернутого растрового изображенияи выравнивание двух растровых изображений в их общей центральной точке.

private BitmapSource ComposeImage(
    BitmapSource image1, BitmapSource image2, double rotationAngle)
{
    var rotation = new RotateTransform(rotationAngle);
    var size1 = new Size(image1.PixelWidth, image1.PixelHeight);
    var size2 = new Size(image2.PixelWidth, image2.PixelHeight);
    var center1 = new Vector(size1.Width / 2, size1.Height / 2);
    var center2 = new Vector(size2.Width / 2, size2.Height / 2);
    var rotatedSize = rotation.TransformBounds(new Rect(size2)).Size;
    var totalSize = new Size(
        Math.Max(size1.Width, rotatedSize.Width),
        Math.Max(size1.Height, rotatedSize.Height));
    var center = new Point(totalSize.Width / 2, totalSize.Height / 2);

    rotation.CenterX = center.X;
    rotation.CenterY = center.Y;

    var dv = new DrawingVisual();

    using (var dc = dv.RenderOpen())
    {
        dc.DrawImage(image1, new Rect(center - center1, size1));
        dc.PushTransform(rotation);
        dc.DrawImage(image2, new Rect(center - center2, size2));
    }

    var rtb = new RenderTargetBitmap(
        (int)totalSize.Width, (int)totalSize.Height, 96, 96, PixelFormats.Default);
    rtb.Render(dv);

    return rtb;
}
...