首页 > 解决方案 > SkiaSharp 镜像位图

问题描述

我正在寻找镜像位图,以便我可以将图像及其镜像彼此相邻。我正在使用 SkiaSharp,我的位图是 SKBitmap,我正在画布上绘制它们。

canvas.Translate( -imageWidth/ 2.0f, -imageHeight/ 2.0f );
canvas.Scale( -1, 1,0,0 );
canvas.DrawBitmap( bitmap, new SKPoint( 0.0f, 0.0f ) );
canvas.Scale( -1, 1, 0, 0 );
canvas.Translate( imageWidth/ 2.0f, imageHeight / 2.0f );

我将图像围绕原点居中,围绕 Y 轴镜像,在画布上绘制位图,然后撤消变换以获得结果。

我的问题似乎是当我开始使用缩放方法时位图就消失了。如果我画一个像圆圈这样的东西,这不会发生。

标签: c#androidxamarinbitmapskiasharp

解决方案


这是因为你实际上想要做相反的事情。SkiaSharp 绘图是通过转换一个矩阵,然后使用它进行绘图来实现的。

您的代码实际上要求这样做: - 将原点移出屏幕(左和上)位图宽度和高度的一半 - 在 y 轴上翻转原点(这会使图像的右侧翻转到最左边) - 在原点左上角绘制图像(现在在屏幕的最左侧)

你想要做的是相反的,但还有一种在中心翻转矩阵的捷径:

canvas.Scale(-1, 1, imageWidth / 2.0f, 0);
canvas.DrawBitmap(bitmap, 0, 0);

要在单独的操作中执行此操作,您只需将整个图像向右平移,然后翻转:

canvas.Translate(imageWidth , 0);
canvas.Scale(-1, 1, 0, 0);

此外,为了避免混合转换并不得不撤消所有操作,只需将它们包装在 a 中SKAutoCanvasRestore(或仅使用SaveandRestore方法):

using(new SKAutoCanvasRestore(canvas, true))
{
   // transform and draw . . .
}

推荐阅读