首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在UWP C#中实现SVG到WriteableBitmap的转换

在UWP C#中实现SVG到WriteableBitmap的转换可以通过以下步骤进行:

  1. 引用相关的库:在项目中引用SVG加载库,例如SharpVectors。可以通过NuGet包管理器安装对应的库。
  2. 加载SVG文件:使用SVG加载库的API,加载SVG文件并将其转换为对应的SVG对象。可以使用SvgDocument类来加载SVG文件。
  3. 创建画布:使用UWP的CanvasControl或者Image控件作为画布,用于显示转换后的SVG图像。
  4. 转换SVG到WriteableBitmap:将加载的SVG对象转换为WriteableBitmap对象。可以使用RenderTargetBitmap类和SvgDrawingRenderer类来实现此转换过程。
    • 使用RenderTargetBitmap类创建一个目标位图,设置其大小和像素密度。
    • 使用SvgDrawingRenderer类将SVG对象绘制到目标位图上,调用Render()方法来实现绘制操作。
  • 显示转换后的图像:将转换后的WriteableBitmap对象设置为画布的内容,从而将SVG图像显示在界面上。

下面是一个示例代码:

代码语言:txt
复制
using System;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using Windows.UI.Xaml.Shapes;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Media;
using SvgDocument = SharpVectors.Dom.SvgDocument;
using SvgConverter = SharpVectors.Converters.SvgConverter;
using Windows.UI.Xaml.Media.Imaging;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System.IO;

public class SVGtoWriteableBitmapConverter
{
    public async Task<WriteableBitmap> ConvertSvgToWriteableBitmap(string svgFilePath)
    {
        // 加载SVG文件
        var svgDocument = await LoadSvgFile(svgFilePath);
        
        // 创建目标位图
        var renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(svgDocument, svgDocument.ViewBox);
        
        // 转换为WriteableBitmap
        var writeableBitmap = new WriteableBitmap(renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight);
        var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
        var pixels = pixelBuffer.ToArray();
        using (var stream = writeableBitmap.PixelBuffer.AsStream())
        {
            await stream.WriteAsync(pixels, 0, pixels.Length);
        }
        
        return writeableBitmap;
    }
    
    private async Task<SvgDocument> LoadSvgFile(string svgFilePath)
    {
        using (var stream = await Windows.Storage.StorageFile.GetFileFromPathAsync(svgFilePath).OpenStreamForReadAsync())
        {
            var svgDocument = SvgConverter.Load(stream);
            return svgDocument;
        }
    }
}

// 在需要显示SVG图像的地方调用ConvertSvgToWriteableBitmap方法
var converter = new SVGtoWriteableBitmapConverter();
var writeableBitmap = await converter.ConvertSvgToWriteableBitmap("path/to/svg/file.svg");

// 设置WriteableBitmap为画布的内容
myCanvas.Background = new ImageBrush { ImageSource = writeableBitmap };

该代码使用了SharpVectors库来加载和转换SVG文件,并使用UWP提供的RenderTargetBitmap和WriteableBitmap类进行转换和显示。请注意,需要先安装SharpVectors库,并将其引入到项目中。

这是一个基本的实现SVG到WriteableBitmap的转换过程。根据具体需求和场景,可以进一步优化和定制代码。希望对您有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

dotnet 从入门到放弃的 500 篇文章合集

本文是记录我从入门到放弃写的博客 博客包括 C#、WPF、UWP、dotnet core 、git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到放弃的...C# 判断系统版本 C# 动态加载卸载 DLL C# 复制列表 C# 如何写 DEBUG 输出 C# 如何在项目引用x86 x64的非托管代码 C# 已知点和向量,求距离的点 C# 强转会不会抛出异常...C# 很少人知道的科技 C# 快速释放内存的大数组 C# 搜索算法 C# 获得设备usb信息 C# 转换类型和字符串 C# 遍历枚举 C# 金额转中文大写 C#将dll打包到程序中 c-70 c-设计模式...WPF 对比 UWP 开发中,需要知道的1000个问题 Visual studio C# 代码使用 NotNull visual Studio 无法调试,提示程序跟踪已退出 visual-studio-...+Tab 隐藏窗口 WPF 好看的矢量图标 wpf 如何使用 Magick.NET 播放 gif 图片 WPF 如何在 WriteableBitmap 写文字 WPF 如何在应用程序调试启动 WPF 如何在绑定失败异常

10.4K20

WPF 使用 Skia 解析绘制 SVG 图片

本文告诉大家如何在 WPF 里面,使用 Skia 解析绘制 SVG 图片。...本文也适合控制台使用 SkiaSharp 解析绘制 SVG 图片,本文的 WPF 部分只是在 Skia 绘制完成之后,将 Skia 的内容绘制到 WPF 的 WriteableBitmap 图片,从而在界面显示...既然 Skia 没有这个功能,那也不能要求对 Skia 的封装 SkiaSharp 有这个功能吧,如 Matthew Leibowitz 大佬的回复 详细请看 https://github.com/mono...SKSvg 就是 Svg.Skia 提供的类型 为了方便进行渲染,获取到 SVG 的尺寸,先转换为 SKBitmap 类型。...这里的设计是转换失败返回空,以上的方法是不能支持所有的 SVG 格式的文件的,只对 SVG 1.1 版本支持比较好 var skBitmap = skSvgPicture.ToBitmap(SKColor.Empty

1.8K30
  • 使用Writeable​Bitmap创建HSV色轮

    色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等,取值0-360。红色是0,绿色是120,蓝色为240。...1.2.1 从RGB到HSL或HSV的转换 (r, g, b)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于r, g和b中的最大者。...1.2.2 从HSV到RGB的转换 给定在HSV中 (h, s, v)值定义的一个颜色,带有如上的h,和分别表示饱和度和明度的s和v变化于0到1之间,在RGB空间中对应的 (r, g, b)三原色可以计算为...使用WriteableBitmap创建HSV色轮 前面介绍了Hsv色轮,也介绍了如何使用WriteableBitmap,那么用WriteableBitmap实现一个HSV色轮是一件很简单的事,只需要计算每个像素点距离中心点的角度...(Hue)和距离(Saturation)得出HsvColor,再转换成ArgbColor填入WriteableBitmap就实现了。

    1.1K30

    win10 uwp 读取保存WriteableBitmap 、BitmapImage 保存 WriteableBitmap 到文件从文件读 WriteableBitmapIma

    我们在UWP,经常使用的图片,数据结构就是 BitmapImage 和 WriteableBitmap。关于 BitmapImage 和 WriteableBitmap 区别,我就不在这里说。...,如果是WriteableBitmap ,那么直接转换 WriteableBitmap 转byte[] bitmap.PixelBuffer.ToArray(); Image 转byte[] 如果我们的...;bitmap为null,于是我在网上继续找,好像没看到 UWP 的可以转,只有win7的 其实大神有说,Image的 Source是 WriteableBitmap ,于是他就能转。...UWP的 BitmapImage 不能转换为 byte[] 或 WriteableBitmap 。这句话是错的。...,请到win10 uwp 存放网络图片到本地 参见:http://www.cnblogs.com/cjw1115/p/5164327.html http://www.cnblogs.com/yuanforprogram

    2K10

    dotnet 读 WPF 源代码笔记 WriteableBitmap 的渲染和更新是如何实现

    在 WPF 和 UWP 中提供的 WriteableBitmap 是支持对像素写入而更改渲染的图片,当然,本文只聊 WPF 的源代码,关于 UWP 部分,咱只知道使用就可以。...通过 WriteableBitmap 可以用来实现高性能的 CPU 渲染,以下是我的其他 WriteableBitmap 博客 WPF 使用 Skia 绘制 WriteableBitmap 图片 WPF...如何在 WriteableBitmap 写文字 WPF 使用不安全代码快速从数组转 WriteableBitmap 在 WriteableBitmap 进行绘制时,有一个重要的功能是设置 DirtyRect...虽然这个类的命名是双缓存,但实际上的做法不是在渲染的时候交换两个缓存的指针,而是在渲染收集过程中,从后面的缓存拷贝数据到前面的缓存 以下是 CopyForwardDirtyRects 方法的代码,我在代码里面添加了一些注释...,因此可以认为使用 WriteableBitmap 的更新,设置 DirtyRect 只影响第二次复制数据的性能,而不会影响渲染性能,依然是整个图片进行渲染 在拷贝到前面的缓存之后,在 WPF 中是在自定义渲染管线里面将前面的缓存作为纹理绘制到形状上

    93320

    C# FFmpeg 音视频开发总结

    2、如果需要用Opencv或者C#的Emgucv这种库来处理视频流,也多是用FFmpeg做编解码然后再转换图像数据给Opencv去处理。用Opencv编解码延迟很高。...首先是C#使用FFmpeg基本上用的是FFmpeg.autogen这个库。...也可以使用FFmpeg.exe,先不谈论FFmpeg.exe的大小,我尝试过从exe中取数据到C#前端显示,相同参数情况下,延迟比使用FFmpeg.autogen高,主要是不能边播放边录制(可以用其它的库来录制...3、其次是c# 要将图像数据渲染到界面显示,最最好使用WriteableBitmap,将WriteableBitmap和绑定到一个Image然后更新WriteableBitmap。...FFmepg.autogen的官方样例中有格式转换函数,但由于它没有指定转换后的格式会出问题(踩坑)。 7、尽量少的格式转换,或者帧复制。这两种方式会提高cpu和内存使用率同时也会有更高的延迟。

    60550

    win10 uwp 如何创建修改保存位图 创建保存图片在 Image 控件使用WriteableBitmap 转换通过读写像素转换 CanvasBitmap

    在 UWP 使用底层的图像渲染就是使用 Softwarebitmap ,这个类提供直接数据修改,可以使用这个类进行软渲染。...实际上 Softwarebitmap 和 WriteableBitmap 是差不多的。但是 Softwarebitmap 可以支持 WriteableBitmap 、 Direct3D 和代码修改。...通过 Softwarebitmap 可以修改转换不同的像素格式和透明通道,支持低级修改像素。...作为一个通用的底层类在很多性能要求比较高的地方用到,如 CapturedFrame、VideoFrame、FaceDetector。下面来告诉大家如何使用。...转换 上面都是读写文件,如果已经使用了 WriteableBitmap 需要把他转换 SoftwareBitmap 可以使用 SoftwareBitmap 的静态函数 SoftwareBitmap.CreateCopyFromBuffer

    2.2K10

    WPF 自己封装 Skia 差量绘制控件

    使用 Skia 能做到在多个不同的平台使用相同的一套 API 绘制出相同界面效果的图片,可以将图片绘制到应用程序的渲染显示里面。...这样的绘制方法显然效率不够高 在上一篇博客里面告诉大家如何在 WPF 中使用 Skia 绘制,请看 WPF 使用 Skia 绘制 WriteableBitmap 图片 而这样的绘制方式意味着每次都需要重新绘制画布...Unlock 方法 此时就可以实现在相同的 SKSurface 上重复上次绘制的内容。...; // 这里的 null! 是 C# 的新语法,是给智能分析用的,表示这个字段在使用的时候不会为空 private SKSurface _skSurface = null!...,为什么需要给他这个值,在上文告诉了大家 接下来在 UIElement_OnMouseMove 方法,也就是 Grid 容器收到的鼠标划过的事件,将划过的点作为线段在画布中 private

    1.1K30

    UWP 手绘视频创作工具技术分享系列

    Runtime App 中, 编程语言可以是 C++、C# 或 VB,相信在 UWP 中尝试过图形渲染绘制的同学们,对 Win2D 都不会陌生,毕竟我我软推荐的实现方式。...来看一下应用中的实现效果,下面三张图显示的是一个 SVG 的绘制过程: ? ? ? 3....因为位图是没有路径的,默认我们没办法像 SVG 那样绘制出它的创作过程, 所以我们选择了一种相对简单的渲染绘制方法:从图片的一个角绘制到另一个角,比如左上角到右下角,保持稳定的速度和方向,这样就由了下图的绘制过程...当然上面只是最简单粗暴的处理方法,实际场景中,很多的 SVG 中不只包含路径,也会包含位图。例如在 PS 里处理好一张图片,然后导入到 AI 中,手动划出一些路径,最后导出 SVG。...今天的文章先概括的介绍一下每个部分的实现原理,后面会陆续对每一个部分做详细的讲解,尤其是 SVG 和 文字绘制方面,详细的原理和实现,以及开发过程中遇到的各种问题,或自己的,或微软系统的。

    1.3K110

    .NET周刊【6月第5期 2024-06-30】

    文章中对C#/.NET平台的分类存在错误,C#/.NET不应被归类为A组件。文中详细介绍了C#从1.0到12的版本历程,并解释了C#及.NET平台的标准化和开源情况。...[WPF]用HtmlTextBlock实现消息对话框的内容高亮和跳转 https://www.cnblogs.com/czwy/p/18273976 本文介绍了如何在WPF中实现能够局部高亮文字并支持链接跳转的消息对话框...特别强调了WPF中WriteableBitmap使用的两个缓冲区的操作方式,以及不同像素格式之间的转换问题。...WPF/C#:如何实现拖拉元素 https://www.cnblogs.com/mingupupu/p/18270547 这篇文章介绍了如何在WPF Canvas中实现拖放功能。...通过调整纹理坐标和使用数学函数,如ceil、sin、round,生成各种网格效果,包括二分网格、四分网格、二值化网格和动态网格。最后扩展到线框网格和鼠标操控的小球视觉效果,提供具体代码示例。

    16810

    .NET周刊【9月第3期 2024-09-15】

    此外,还可以配置多种负载均衡策略,如轮询、随机等,提升服务调用的效率和灵活性。总之,服务发现简化了微服务间的调用过程,是实现微服务架构的重要组件。...dotnet 读 WPF 源代码笔记 从 WM_POINTER 消息到 Touch 事件 https://www.cnblogs.com/lindexi/p/18403860 本文介绍如何在 WPF 中通过...从.NET 9中移除了BinaryFormatter,并讨论了ASP.NET Core中的防抖实现。还介绍了一些C#用户控件如流动管道和指示灯,以及使用Dependify工具处理.NET依赖关系。...此更新吸引了许多传统 UWP 开发者,不需全面迁移即可升级到 .NET 9。微软提供的预览版虽有粗糙之处,但预计将成为开发者首选的升级方式。...微软在.NET 9中重点发展Native AOT,支持老旧系统如Windows 7和XP,并计划在未来扩展到更多平台。这提高了.NET应用的执行效率和兼容性,对开发者是重要的技术升级。

    10110

    Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用

    手绘视频应用开发     手绘视频 UWP 应用开发,基于对不同手绘元素,如文字,SVG,位图,Ink 等的解析,基于 Win2D 的渲染方式进行动画展示,并基于类 FFMpeg 的方式进行动画视频的合成...中, 编程语言可以是 C++、C# 或 VB。...SVG 手绘     SVG 元素是一种矢量图形,因为它的矢量属性和文件组成,它的路径数据可以在手绘视频中被还原和绘制出来,是手绘视频中重要的元素。    ...我们对位图的处理方式,可以实现简单的手绘效果,也就是从左上角到右下角来匀速涂抹出图片;也可以做进一步的处理,比如支持用户在位图的背景上做进一步的线条勾勒,保存为 SVG,绘制时是背景图被勾勒出来的效果;...而 Windows ML 可以实现模型本地化,可以把 Autodraw 训练的模型集成在 UWP 应用中,减少网络传输时间,降低服务器负载,本地实现计算过程。 7.

    1.2K30

    如何在 C# 中实现高效的内存管理,避免内存泄漏和提高性能?

    在C#中实现高效的内存管理和提高性能可以采取以下几个方法: 使用对象池:对象池是一种重复使用对象的技术,可以减少内存分配和释放的开销。...特别是对于一些需要手动释放的资源,如文件、数据库连接等。 使用垃圾回收器:C#中的垃圾回收器会自动管理内存的分配和释放,但是它是非确定性的,不可预测的。...避免频繁的内存分配:频繁的内存分配会导致内存碎片,影响性能。可以使用对象池、复用对象或者使用值类型来减少内存分配的次数。...使用合适的数据结构和算法:使用合适的数据结构和算法可以减少内存的使用和提高性能。...总之,在C#中实现高效的内存管理和提高性能需要综合考虑多个方面,包括使用对象池、及时释放资源、合理使用垃圾回收器、避免频繁的内存分配、使用合适的数据结构和算法等。

    29510

    Windows桌面程序开发

    前言 最近在做Windows桌面程序开发,最初考虑到团队的技术构成(没有.NET开发),决定用Electron作为解决方案来开发,但是最后因为需要实现应用向其它未处于激活状态的应用发消息的功能无法通过自带的...api实现(需要借助node-ffi调用dll解决),所以就对各个方案做对比做最后的决策(其实还是在纠结用C#.net还是Electron,其它的方案并不考虑)。...这将使得开发者能够更灵活地将 UWP 中一些更现代化的接口引入到 WPF 和 Windows Forms 中。...],大多数其它第三方的编辑器,如 Sublime, Emacs, 和 VI 同样支持 .NET Core。...在容器化大行其道的今天,.NET Core 的模块化、轻量级以及它的灵活性使得它能很容易地部署到容器中,容器可以部署到任何平台,如 云上、Linux 和 Windows 上。

    10.9K10

    .NET 的 Native AOT 现在是什么样的?

    今天要写的这篇文章源自昨天在朋友圈发的文章《UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化》[1],一位小伙伴的对话让我想全面梳理下Native AOT的现在的进展...此过程包括将 C# 代码转换为 IL 代码,然后转换为 Native 代码,形成一个两步编译过程。但这是一个实现细节。这就是 AOT .NET 程序集 框在下面的架构中为灰色的原因。...增强的知识产权保护:AOT 编译将源代码转换为优化的机器代码,这使得逆向工程尝试更具挑战性。生成的本机代码比 IL 代码更加模糊,并且难以破译,因为 IL 代码可以轻松反编译为原始 C# 代码。...Native AOT 技术可以将.NET 代码预先编译为本地代码,从而实现更快的启动时间和更高的执行效率。 在.NET 9中,微软已经将Native AOT作为提升性能的关键点之一[2]。...在.NET MAUI的测试中,通过调用JNI来获取Java数组元素的性能比使用string.Split和新的Span方法更差。这表明开发者正在考虑如何在未来版本中优化这一过程。

    7400
    领券