WPF 任意角度旋转和 return BitmapSource

WPF Rotate and return BitmapSource by any angle

嘿,我试过这个:

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;
    }

但这并不能正常工作。我有这个 image at 0 degree and after rotation at 30 degrees this image.

怎样才能使图片旋转后完整?

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;

元素是旋转后的图像

以下方法从另外两个位图创建一个组合位图,其中第二个位图围绕它们的公共中心点旋转。

该方法的两个关键部分是计算旋转位图的变换边界,以及将两个位图在它们的公共中心点对齐。

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;
}