c# - SkiaSharp 镜像位图

标签 c# android xamarin bitmap skiasharp

我想镜像一个位图,这样我就可以让一个图像和它的镜像彼此相邻。我正在使用 SkiaSharp,我的位图是 SKBitmap,我正在 Canvas 上绘制它们。

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 轴进行镜像,在 Canvas 上绘制位图,然后撤消变换以获得结果。

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

最佳答案

这是因为你实际上想做相反的事情。 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);

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

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

关于c# - SkiaSharp 镜像位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52058337/

相关文章:

c# - LINQ 查询复制到数据表

android - 在 Android 中使用纬度和经度值制作 Location 对象

android - MPAndroidChart:LineChart 填充不会在 XAxis 处停止

java - 从字符串中删除特定字符

c# - 如何编写调用方法的事件

c# - IProgress<T> 同步

xamarin - 使用 Xamarin.UITest 测试我的 Xamarin.Forms iOS 应用程序 : The first test always fails

android - Xamarin.Android - GC 停止我的应用程序 2 秒

xamarin - Xamarin 中的应用程序输出按钮

c# - Entity Framework 6 Code First 自定义函数