C# 在Win2D中旋转图像
我正在尝试旋转图像,但无法获得预期结果。 我尝试使用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.
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
谢谢。您好,您能提供一个更完整的可复制演示吗?在我的测试样本中,它解决了图片失真的问题。我在问答中找到了答案。他给出的解决方案解决了你遇到的问题吗?嗨,我请他帮助我,他与我发布并分享了问答链接。这个解决方案对我有效。也谢谢你的帮助。很高兴你找到了解决办法。如果这个解决方案对你有效,你可以把它写下来作为答案并做标记,这将帮助其他有同样问题的人。谢谢