标签: skiasharp

C# SkiaSharp OpenTK Winform - 如何从后台线程绘制?

我正在尝试用 SkiaSharp 替换 GDI+,作为数据可视化框架,该框架使用实时不断变化的工程数据呈现多层可平移可缩放图形。

在 GDI+ 中,应用程序执行了以下操作:

  • 创建了一组具有透明背景的绘图图层,通常是网格图层、一个或多个数据图层以及用于光标信息和突出显示的覆盖图层,每个图层都由单独的位图支持。
  • 在渲染循环后台线程中,仅使用 GDI+ 重绘每个渲染周期需要更新的图层(位图)。这可能需要数千条计算和转换的线条、矩形和文本来创建热图、波形、直方图、数据标签等。
  • 然后,堆栈中的每个绘图层将由后台线程 BitBlt 转换为复合位图
  • 最终的复合位图将以高达 30fps 的速度绘制到 GUI 线程中的 WinForm PictureBox。

直到最终图像呈现的所有事情都是在一个或多个后台线程中完成的。 GUI 线程仅涉及将完成的图像绘制到 PictureBox 中。这很重要,因为还有许多其他 GUI 控件需要保持响应能力。这非常有效,只不过它是基于 CPU 的。小窗口没问题,但在 4K 屏幕上最大化会减慢渲染速度,导致程序几乎无法使用。

我想用 GPU 加速的 SkiaSharp 重新创建这个概念。

我尝试创建数十个不同的测试程序,但不断出现跨线程访问冲突,或者屏幕上没有显示任何内容,或者严重崩溃。让我问一些基本问题,而不是发布代码:

问题:

  • 您将如何创建这个框架?SkiaSharp 能做到这一点吗?
  • 我的每个图层类都应该维护 SKSurface、SKCanvas、SKImage 或 SKBitmap 吗?- 同样,如果当前周期不需要重绘某个图层,则该图层需要保留先前绘制的内容以在下一个合成图像中使用。
  • GUI 线程上需要 GLControl 和 GRContext 来显示最终的合成图像,但是是否应该有另一个单独的 GRContext 供后台渲染线程使用?- 如何使用 GPU 加速进行创作?
  • 有人可以指出类似概念的可行示例吗?(GPU加速从后台线程到GLControl的渲染)
  • 我应该仅使用隐藏在后台的 SkiaSharp 和带有 PictureBox 的 GDI+ BitBlt 在屏幕上显示合成图像吗?- 这能解决一些线程问题吗?

任何定义方法和注意事项的帮助将不胜感激!

c# multithreading gpu opentk skiasharp

11
推荐指数
1
解决办法
3255
查看次数

在 Linux 上使用 SkiaSharp 1.68 时出现 DllNotFoundException

在 Linux 上将 SkiaSharp 1.68.0 与 .NET Core 2.2 结合使用,并在尝试在 jpeg-memory-stream 上使用 Decode 时出现此错误(相同的代码适用于 Windows):

System.TypeInitializationException: The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibSkiaSharp: cannot open shared object file: No such file or directory
   at SkiaSharp.SkiaApi.sk_managedstream_set_delegates(IntPtr pRead, IntPtr pPeek, IntPtr pIsAtEnd, IntPtr pHasPosition, IntPtr pHasLength, IntPtr pRewind, IntPtr pGetPosition, IntPtr pSeek, IntPtr pMove, …
Run Code Online (Sandbox Code Playgroud)

.net-core skiasharp

9
推荐指数
2
解决办法
9611
查看次数

Skiasharp 将画布导出为图像

我有个问题。我有一个带有一些位图的skiasharp画布。现在我想将带有位图的画布导出到图像,但我不知道如何做到这一点,或者是否可能。

有人能帮我吗?

xamarin.ios xamarin.android xamarin xamarin.forms skiasharp

9
推荐指数
1
解决办法
1万
查看次数

PDF页面上的多个剪辑区域无法正常工作

我正在使用SkiaSharp将标签打印到PDF(和其他东西).PDF的每个页面都可以有多个行和列.我需要将每个标签剪裁成正确的尺寸,这样它就不会丢弃相邻的标签.

为了进行测试,每个标签都有一个延伸得太远的矩形加上7行文字和一个靠近垂直中间的圆圈.

我的代码是这样的:

using (var region = new SKRegion())
{
   region.SetRect(_labelClipRect);
   _currentCanvas.ClipRegion(region, SKClipOperation.Intersect);
   _labelView.Draw(_currentCanvas, _printRequest.Device.DPI, xOffsetPX, yOffsetPX);
}
Run Code Online (Sandbox Code Playgroud)

结果是: 显示剪辑错误的PDF的片段 每页上的第一个标签看起来都是正确的,但其余的都很时髦.缺少矩形和圆形,文本根本没有剪裁.

有人见过这样的样品吗?

谢谢

skiasharp

8
推荐指数
1
解决办法
109
查看次数

如何着色装载SkiaSharp的黑白SVG?

我正在玩新版本的SkiaSharp(1.55),它支持在Xamarin.Android(而不仅仅是)上加载SVG.由于它是在不到10天前发布的事实,我找不到这么多文档.

加载黑白SVG后,我想将它着色(将前景填充颜色从黑色改为我需要的任何颜色).这就是我正在做的事情.

using (var paint = new SKPaint())
{
    paint.ColorFilter = SKColorFilter.CreateLighting(SKColors.White, SKColor.Parse("#FF0000"));
}
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,但我的印象是我没有使用正确的过滤器.

  1. 是否有任何具有"着色"功能的过滤器?
  2. 如何实现相同的背景像素呢?
  3. 任何简单的方法来反转颜色?

欢迎详细解释.

svg android xamarin.android xamarin skiasharp

7
推荐指数
1
解决办法
1113
查看次数

SKGLView比SKCanvasView暗得多

我的应用程序主屏幕通过SKCanvasView呈现.颜色准确反映了我在代码中指定的值.

如果我交换SKGLView(硬件加速版),不更改其他代码,结果是60%更暗:

    <!--<skia:SKCanvasView PaintSurface="OnCanvasViewPaintSurface" />-->
    <skia:SKGLView PaintSurface="OnCanvasViewPaintSurface" />
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该如何解决?

xamarin xamarin.forms skiasharp

7
推荐指数
1
解决办法
299
查看次数

将当前平台字体传递到SKTypeface?

尝试渲染中文(或其他符号)文本时.SkiSharp将渲染框而不是正确的中文字符.显然,Skia默认使用的字体不支持这些字符.所以我们必须使用支持这些字符的字体来分配我们自己的SKTypeface.

我最初的策略是简单地包含必要的字体来渲染这些字符,这些字符工作正常.但是,当使用自己的字体支持多种不同的符号语言时,应用程序的大小会急剧增加(每个字体大约15 MB).

所以考虑一下这个...默认平台字体似乎支持这些符号字符中的任何一个就好了.我的意思是,默认情况下使用的字体完美呈现按钮,标签和标题.

所以我目前的想法是,为什么我不能只是通过,任何字体进入我的控制SKTypeface?

问题是,我不知道如何获得任何后备或默认字体,以便用它创建一个新的SKTypeface.

我的问题

如何使用渲染这些按钮,标签和标题的相同字体创建SKTypeface?


注意:如果你需要任何东西,从我来帮助你理解问题或解决问题只是让我知道.

c# fonts xamarin.forms skiasharp

7
推荐指数
1
解决办法
710
查看次数

如何在 Macos 上使用 Avalonia 和 Skia 后端渲染一组图元?

我需要创建一个简单的应用程序来将图形网络绘制到画布上。当我使用 .net core 时,最好的解决方案之一似乎是 Avalonia + Skia 后端。问题是我还没有找到任何好的文档或示例来说明它。

如何使用 Avalonia 和 Skia 渲染后端渲染一组 primites?

macos skia .net-core skiasharp avaloniaui

7
推荐指数
0
解决办法
770
查看次数

使用 C# 以跨平台方式测量字符串的宽度(以像素为单位)

我有一些现有的 C# 代码,用于System.Drawing.Common测量字符串的近似宽度(以像素为单位):

var text = "abc123 this is some long text my dog's name is fido.";

using (var bitmap = new Bitmap(500, 50))
using (var graphics = Graphics.FromImage(bitmap))
{
    // Size: 9 Points
    using var font = new System.Drawing.Font(familyName: "Times New Roman", emSize: 9f);
    
    var ms = graphics.MeasureString(text, font);
    
    // Output: 'abc123 this is some long text my dog's name is fido.' via System.Drawing: 394.00195 x 22.183594
    Console.WriteLine($"'{text}' via System.Drawing: {ms.Width} x {ms.Height}");
}
Run Code Online (Sandbox Code Playgroud)

升级到 后.NET …

skiasharp imagesharp system.drawing.common .net-6.0

7
推荐指数
1
解决办法
2058
查看次数

关于Xamarin Skiasharp笔画的OnClick功能

如何在skiashark笔划上创建一个onclick函数?我创建了一个包含多个路径的圆形图:

https://i.stack.imgur.com/ngiz6.jpg

例如绿线:

SKPaint paint4 = new SKPaint
{
    Style = SKPaintStyle.Stroke,
    IsAntialias = true,
    Color = Color.FromHex("#5bd363").ToSKColor(),                   // Overlay Colour of Radial Gauge
    StrokeWidth = progressUtils.getFactoredWidth(radialGaugeWidth + 15), // Overlay Width of Radial Gauge
    StrokeCap = SKStrokeCap.Butt                                  // Round Corners for Radial Gauge
};

SKPath path4 = new SKPath();
path4.AddArc(rect, (360 / 24) * 9.25f + 90, (float)sweepAngleSlider3.Value);
canvas.DrawPath(path4, paint4)
Run Code Online (Sandbox Code Playgroud)

我如何做到这一点,当你点击一个笔画,例如绿色笔画时,会发生什么?

c# xamarin skiasharp

6
推荐指数
0
解决办法
119
查看次数