Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Win2D中旋转图像_C#_Uwp_Graphics_Win2d - Fatal编程技术网

C# 在Win2D中旋转图像

C# 在Win2D中旋转图像,c#,uwp,graphics,win2d,C#,Uwp,Graphics,Win2d,我正在尝试旋转图像,但无法获得预期结果。 我尝试使用WIn2D,但无法按预期制作图像 我的密码 public async void Rotate(string originalImagepath, Rect originalImageRect, float degrees) { int height = (int)Math.Sqrt(originalImageRect.Width * originalImageRect.Width + originalImageRect.

我正在尝试旋转图像,但无法获得预期结果。 我尝试使用WIn2D,但无法按预期制作图像

我的密码

public async void Rotate(string originalImagepath, Rect originalImageRect, float degrees)
    {
        int height = (int)Math.Sqrt(originalImageRect.Width * originalImageRect.Width + originalImageRect.Height * originalImageRect.Height);

        CanvasDevice device = CanvasDevice.GetSharedDevice();
        CanvasRenderTarget webCardImage = null;
        CanvasBitmap bitmap = null;
        var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
        Vector2 endpoint = new Vector2((float)originalImageRect.Width / 2, (float)originalImageRect.Height / 2);

        try
        {
            webCardImage = new CanvasRenderTarget(device, height, height, logicalDpi);
            using (var ds = webCardImage.CreateDrawingSession())
            {
                ds.Clear(Colors.Transparent);

                using (FileStream imageStream = new FileStream(originalImagepath, FileMode.Open))
                {
                    IRandomAccessStream fileStream = imageStream.AsRandomAccessStream();
                    bitmap = await CanvasBitmap.LoadAsync(device, fileStream);
                }

                ICanvasImage image = new Transform2DEffect
                {
                    Source = bitmap,
                    TransformMatrix = Matrix3x2.CreateRotation(degrees, endpoint),
                };
                var sourceRect = image.GetBounds(ds);
                ds.DrawImage(image, new Rect(originalImageRect.X, originalImageRect.Y, originalImageRect.Width, originalImageRect.Height), sourceRect, 1, CanvasImageInterpolation.HighQualityCubic);

            }
        }
        catch (Exception ex)
        {

        }
        //Save Image Code here
    }
预期产出:

我生成的图像:


注意:Rect originalImageRect指的是我要旋转的主图像Rect。

发生这种情况时,意味着图像旋转后,目标渲染矩形的大小(可能是高度或宽度)小于旋转图像的大小,从而导致图像压缩

我分析了您的代码,您尝试创建一个正方形,边长为
originalImageRect
对角线长度,以确保图像在围绕中心旋转时不会超出渲染范围

这很好,但渲染时存在一些偏差

默认情况下,图像位于画布渲染目标的左上角。如果未执行置换,则旋转时中心点位于左上角,这意味着它仍将超出渲染范围

您可以尝试以下方法:

double height=Math.Sqrt(originalImageRect.Width*originalImageRect.Width+originalImageRect.height*originalImageRect.height);
浮动y=(浮动)((高度-原始管理器高度)/2.0f);
浮动x=(浮动)((高度-原始图像宽度)/2.0f);
向量2端点=新向量2((浮动)高度/2,(浮动)高度/2);
尝试
{
webCardImage=新画布渲染目标(MyCanvas,(浮动)高度,(浮动)高度,logicalDpi);
使用(var ds=webCardImage.CreateDrawingSession())
{
//初始化画布位图
ICanvasImage图像=新的Transform2DEffect
{
源=位图,
TransformMatrix=Matrix3x2.CreateTranslation(新向量2(x,y))
*Matrix3x2.CreateRotation(度、端点)
};
var sourceRect=image.GetBounds(ds);
ds.DrawImage(图像);
}
}
捕获(例外情况除外)
{
}
我们首先移动图像,将其移动到画布的中心,然后围绕画布的中心旋转图像,以便实现我们的目标

此外,当使用
DrawImage()
方法时,不需要为渲染约束另外定义
Rect


谢谢。

您好,您能提供一个更完整的可复制演示吗?在我的测试样本中,它解决了图片失真的问题。我在问答中找到了答案。他给出的解决方案解决了你遇到的问题吗?嗨,我请他帮助我,他与我发布并分享了问答链接。这个解决方案对我有效。也谢谢你的帮助。很高兴你找到了解决办法。如果这个解决方案对你有效,你可以把它写下来作为答案并做标记,这将帮助其他有同样问题的人。谢谢