资讯动态

SkiaSharp 1.55.1 服务补丁版解析:打包修复与像素级 API 增强

发布时间:2026/10/14 2:56:29 来源:尧图企业网站定制
图形学图像处理跨平台【免费下载链接】SkiaSharpSkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Googles Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.项目地址https://gitcode.com/gh_mirrors/sk/SkiaSharp点击查看免费下载SkiaSharp 1.55.1 是 2016 年 11 月发布的 servicing release服务补丁版在 1.55.0 大规模 API 清理的基础上完成打包与捆绑修复并同步补齐了一批面向像素操作、增量解码与画布状态管理的实用 API。本文以官方发布说明为主体结合当前仓库中对应的绑定源码与各平台视图实现逐项解析 1.55.1 的 API 变更内容、底层调用链与升级注意事项帮助读者准确理解该版本的能力边界与迁移路径。版本定位servicing release 做了什么根据发布说明documentation/docfx/releases/1.55.1.mdSkiaSharp 1.55.1 是一个servicing release发布于 2016 年 11 月 20 日其核心工作是在 1.55.0 基础上完成bundling捆绑与 packaging打包修复没有任何 Breaking Changes破坏性变更升级路径平坦。需要理解的是1.55.1 紧跟在 1.55.02016 年 11 月 10 日发布之后而 1.55.0 才是引入破坏性变更的版本。对比 1.55.0 发布说明 可见1.55.0 做的是 API cleanup去掉公共 API 上的可选参数默认值、将SKCodecOptions.Subset改为可空类型、移除SKCodec.GetValidSubset与SKDocument.Close等旧 API。因此1.55.1 的迁移成本主要在 1.55.0 的 ABI 变化需要按新签名重新编译1.55.0 → 1.55.1 本身无需任何代码改动。除了打包修复1.55.1 还通过 API diff 暴露了一批实质性的新 API。完整的差异清单见 documentation/docfx/releases/1.55.1/index.md下面按模块逐一拆解。SKBitmap像素级操作的全面补强1.55.1 对SkiaSharp.SKBitmap的增强最多覆盖属性、解码、像素安装与拷贝四条主线。ReadyToDraw 属性新增只读属性ReadyToDraw用于判断位图是否足够有效以至于可以被绘制。当前仓库中的绑定实现位于 binding/SkiaSharp/SKBitmap.cs它直接调用原生接口SkiaApi.sk_bitmap_ready_to_draw并配合GC.KeepAlive(this)防止托管对象在调用期间被回收public bool ReadyToDraw { get { var result SkiaApi.sk_bitmap_ready_to_draw (Handle); GC.KeepAlive (this); return result; } }在实际绘制如canvas.DrawBitmap之前先用该属性做一次校验可以避免对未分配像素的位图执行无效绘制。Decode 系列重载新增的Decode静态重载允许在解码时直接指定目标SKImageInfopublic static SKBitmap Decode (SKCodec codec, SKImageInfo bitmapInfo); public static SKBitmap Decode (SKData data, SKImageInfo bitmapInfo); public static SKBitmap Decode (SKStream stream, SKImageInfo bitmapInfo); public static SKBitmap Decode (byte[] buffer, SKImageInfo bitmapInfo); public static SKBitmap Decode (string filename, SKImageInfo bitmapInfo);这意味着可以从SKCodec、SKData、SKStream、字节数组乃至文件名五种输入来源解码并在解码阶段就指定颜色类型、Alpha 类型与尺寸等SKImageInfo参数如将大图直接解码缩放到目标尺寸节省中间内存。仓库中现有的基础重载如Decode (SKCodec codec)位于 binding/SkiaSharp/SKBitmap.cs 附近1.55.1 新增的是带SKImageInfo参数的版本。GetPixels / SetPixels / InstallPixels直接操作像素内存新增的像素访问 API 让位图可以与原生内存直接互操作public IntPtr GetPixels (); public void SetPixels (IntPtr pixels); public void SetPixels (IntPtr pixels, SKColorTable ct); public bool InstallPixels (SKImageInfo info, IntPtr pixels); public bool InstallPixels (SKImageInfo info, IntPtr pixels, int rowBytes); public bool InstallPixels (SKImageInfo info, IntPtr pixels, int rowBytes, SKColorTable ctable); public bool InstallPixels (SKImageInfo info, IntPtr pixels, int rowBytes, SKColorTable ctable, SKBitmapReleaseDelegate releaseProc, object context);InstallPixels允许把一块外部管理的内存安装到位图上同时通过rowBytes指定行字节数默认可取info.RowBytes通过SKColorTable提供调色板并可选传入SKBitmapReleaseDelegate回调——当位图释放该内存时回调会被触发从而安全地管理外部内存的生命周期。当前仓库中InstallPixels的多个重载收敛于带 release delegate 的完整版本见 binding/SkiaSharp/SKBitmap.cs内部会按需把用户委托包装为原生回调public bool InstallPixels (SKImageInfo info, IntPtr pixels, int rowBytes, SKBitmapReleaseDelegate releaseProc, object context) { return InstallPixels (info, pixels, rowBytes, releaseProc ! null ? new SKBitmapReleaseDelegate ((addr, _) releaseProc (addr, context)) : null); }CopyPixelsTo 与 SetColorTableCopyPixelsTo用于把位图像素拷贝到外部缓冲区public bool CopyPixelsTo (IntPtr dst, int dstSize, int dstRowBytes, bool preserveDstPad);其中dstSize为目标缓冲区大小字节、dstRowBytes为目标行字节数、preserveDstPad决定是否保留目标缓冲区的行填充。SetColorTable则用于为调色板位图设置SKColorTable与InstallPixels的调色板参数配套使用。SKCanvas绘制能力与状态管理的补充DrawPositionedText替代 DrawText 的定位文本绘制1.55.1 将DrawText的两个重载标记为Obsolete提示 Use DrawPositionedText instead.并新增DrawPositionedText作为替代[Obsolete (Use DrawPositionedText instead.)] public void DrawText (string text, SKPoint[] points, SKPaint paint); public void DrawPositionedText (string text, SKPoint[] points, SKPaint paint); public void DrawPositionedText (IntPtr buffer, int length, SKPoint[] points, SKPaint paint);DrawPositionedText允许为文本中的每个字符指定独立的绘制位置SKPoint[]用于逐字符定位排版。旧代码应迁移到新方法以消除编译警告。DrawRegion 与 QuickRejectpublic void DrawRegion (SKRegion region, SKPaint paint); public bool QuickReject (SKPath path); public bool QuickReject (SKRect rect);DrawRegion直接用给定SKPaint填充/描边一个SKRegion区域适合复杂的非矩形裁剪区域绘制QuickReject用于快速判断给定矩形或路径的边界是否与当前画布的裁剪区完全不相交——若返回true则可跳过本次绘制。当前仓库实现位于 binding/SkiaSharp/SKCanvas.cs其中路径版本会先利用path.IsEmpty短路判断再退化为矩形边界判断public bool QuickReject (SKPath path) { return path.IsEmpty || QuickReject (path.Bounds); }SKAutoCanvasRestore新增便捷构造函数SKAutoCanvasRestore是管理画布 Save/Restore 的 RAII 辅助类1.55.1 新增了只传SKCanvas的构造函数等价于doSave true。当前仓库实现见 binding/SkiaSharp/SKCanvas.cspublic SKAutoCanvasRestore (SKCanvas canvas) : this (canvas, true) { } public SKAutoCanvasRestore (SKCanvas canvas, bool doSave) { this.canvas canvas; this.saveCount 0; if (canvas ! null) { saveCount canvas.SaveCount; if (doSave) { canvas.Save (); } } }构造时记录SaveCount并调用SaveDispose时通过RestoreToCount (saveCount)恢复画布的矩阵、裁剪区与绘制过滤器状态即作用域退出自动还原避免手工 Save/Restore 配对遗漏导致的画布状态污染public void Dispose () { Restore (); } public void Restore () { if (canvas ! null canvas.Handle ! IntPtr.Zero) { canvas.RestoreToCount (saveCount); } }典型用法using (new SKAutoCanvasRestore (canvas)) { canvas.Translate (x, y); canvas.Scale (scale); // 在此绘制的所有内容都处于变换后的坐标系中 } // 离开作用域后画布自动还原SKCodec增量解码能力1.55.1 为SKCodec引入了增量解码incremental decodeAPI适用于网络图片渐进式加载等场景public SKCodecResult StartIncrementalDecode (SKImageInfo info, IntPtr pixels, int rowBytes); public SKCodecResult StartIncrementalDecode (SKImageInfo info, IntPtr pixels, int rowBytes, SKCodecOptions options); public SKCodecResult StartIncrementalDecode (SKImageInfo info, IntPtr pixels, int rowBytes, SKCodecOptions options, SKColorTable colorTable, ref int colorTableCount); public SKCodecResult StartIncrementalDecode (SKImageInfo info, IntPtr pixels, int rowBytes, SKCodecOptions options, IntPtr colorTable, ref int colorTableCount); public SKCodecResult IncrementalDecode (); public SKCodecResult IncrementalDecode (out int rowsDecoded);工作流是先调用StartIncrementalDecode声明目标SKImageInfo、输出像素缓冲与行字节数可选指定SKCodecOptions与调色板然后在新数据到达时反复调用IncrementalDecode继续解码out int rowsDecoded可获知当前已解码的行数从而支持边下载边渲染的渐进式显示。注意该能力与 1.55.0 将SKCodecOptions.Subset改为可空类型的变化衔接使用二者共同服务于灵活的解码控制。新类型SKAutoLockPixels 与 SKBitmapReleaseDelegateSKAutoLockPixels像素锁定的 RAII 封装新增的SKAutoLockPixels是一个IDisposable类型用于在位图像素访问期间锁定/解锁像素内存public class SKAutoLockPixels : System.IDisposable { public SKAutoLockPixels (SKBitmap bitmap); public SKAutoLockPixels (SKBitmap bitmap, bool doLock); public virtual void Dispose (); public void Unlock (); }构造时doLock默认true锁定位图像素确保底层存储不会被移动或回收Dispose/Unlock解除锁定。当配合GetPixels/SetPixels等直接内存操作时用using语句包裹可保证锁定与解锁配对。SKBitmapReleaseDelegate像素内存释放回调public sealed delegate SKBitmapReleaseDelegate : System.MulticastDelegate, ... { public virtual void Invoke (IntPtr address, object context); }该委托用于InstallPixels的释放回调签名接收像素内存地址与用户上下文对象。当位图销毁或重新安装像素时托管层会回调该委托让外部内存的持有者有机会执行释放逻辑——这正是InstallPixels能安全接管外部内存的关键配套类型。其他核心类型的小幅增强GRBackendRenderTargetDescGpu 命名空间新增RectSKRectI与SizeSKSizeI两个只读属性便于直接取得 GPU 后端渲染目标的矩形区域与尺寸。SKColor新增public SKColor (uint value)构造函数允许直接以uint位模式构造颜色如从0xFFRRGGBB形式的常量初始化。SKColorFilter新增静态工厂public static SKColorFilter CreateBlendMode (SKColor c, SKBlendMode mode)可基于指定颜色与混合模式SKBlendMode创建颜色过滤器替代旧的手动组合方式。SKColorTable新增索引器属性public SKColor Item { get; }可按索引读取调色板颜色条目。SKData新增IsEmpty属性、AsStream (bool streamDisposesData)与ToArray ()方法把SKData与System.IO.Stream/byte[]的互转补齐其中AsStream的布尔参数控制流释放时是否连带释放底层SKData。SKPath新增IsEmpty与VerbCount属性前者判断路径是否为空也用于上述QuickReject的短路优化后者返回路径中 verb 指令的数量便于遍历分析路径结构。Views 层IgnorePixelScaling 跨平台统一在 API diff 中各平台视图统一新增了IgnorePixelScaling属性用于控制绘制表面是否忽略设备的像素缩放即是否以物理像素而非逻辑/缩放像素作为绘制坐标平台程序集受影响类型SkiaSharp.Views.AndroidSKCanvasViewSkiaSharp.Views.MacSKCanvasLayer、SKCanvasViewSkiaSharp.Views.iOSSKCanvasLayer、SKCanvasViewSkiaSharp.Views.tvOSSKCanvasLayer、SKCanvasViewSkiaSharp.Views.UWPSKXamlCanvasSkiaSharp.Views.WPFSKElementSkiaSharp.Views.FormsSKCanvasView含IgnorePixelScalingProperty可绑定属性从当前仓库的现代实现仍能印证这一语义例如 source/SkiaSharp.Views/SkiaSharp.Views.WPF/SKElement.cs 中当IgnorePixelScaling为false时使用缩放后的size物理像素作为表面尺寸为true时使用未缩放的unscaledSize从而在高 DPI 屏幕上获得更清晰的绘制结果。IgnorePixelScaling true时画布以逻辑像素为坐标绘图内容会被设备自动放大保持默认false则画布以物理像素为单位需自行按缩放比例处理坐标。注意SkiaSharp.Views.Desktop.dll在 1.55.1 中标注为 No changes桌面共享程序集无 API 变更。升级与迁移建议1.55.0 → 1.55.1 无破坏性变更可直接升级以获得打包/捆绑修复若从更早版本升级需一并处理 1.55.0 的 ABI 变化无默认参数的 API 需显式传参、SKCodecOptions.Subset改为可空类型、旧方法移除按新签名重新编译。收到DrawText弃用警告的代码迁移到DrawPositionedText传SKPoint[]指定每个字符的位置。涉及外部内存的位图场景如从原生层接收像素缓冲优先使用InstallPixelsSKBitmapReleaseDelegate管理生命周期并用SKAutoLockPixels保证访问期间的像素锁定绘制前可用ReadyToDraw与QuickReject做前置校验与裁剪加速。渐进式加载图片可利用SKCodec.StartIncrementalDecode/IncrementalDecode分块解码结合rowsDecoded输出实现逐行渲染。小结作为 1.55.0 之后的第一个服务补丁版SkiaSharp 1.55.1 在保证零破坏性变更的前提下完成了打包层面的修复同时通过 API diff 补齐了位图像素操作、增量解码、画布状态管理与各平台视图像素缩放控制等一批高价值 API。对需要精细化内存控制与渐进式渲染的开发者而言这一版本奠定了后续 1.561.60 系列迭代的重要基础其 API 设计如InstallPixels回调、SKAutoCanvasRestoreRAII 模式至今仍可在仓库对应源码中直接查阅与参考。赞分享图形学图像处理跨平台【免费下载链接】SkiaSharpSkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Googles Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.项目地址https://gitcode.com/gh_mirrors/sk/SkiaSharp点击查看免费下载相关推荐Kornia 单像素图像轴修复normalize_laf 与 denormalize_laf 的边界语义与补丁提取器修复解析Kornia 单像素图像轴修复 normalize_laf 与 denormalize_laf 的边界语义与补丁提取器修复解析 本指南围绕 Kornia 变更计算机视觉人工智能深度学习图像处理Vitess 9.0.2 补丁版本发布说明深度解析查询服务修复、备份压缩回退与集群管理增强Vitess 9.0.2 补丁版本发布说明深度解析查询服务修复、备份压缩回退与集群管理增强 本文基于 changelog/9.0/9.0.2/release_数据库分布式数据库云原生后端数据存储Vector v0.33.1 补丁版技术详解Debian 打包、Datadog Metrics、dnstap 与 Kafka 四项修复的源码级剖析Vector v0.33.1 补丁版技术详解Debian 打包、Datadog Metrics、dnstap 与 Kafka 四项修复的源码级剖析 本篇技术指可观测性数据工程数据集成日志分析上一篇Nebular组件库性能优化指南从加载速度到渲染效率下一篇Easy-Vibe 实战课AI Agent 原理与实践——从工具调用、规划、记忆到智能体构建创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑