当前位置: 首页 > news >正文

WPF迁移avalonia之图像处理(一)

从WPF迁移到avalonia中,对于图像处理部分,在WPF常用System.Windows.Drawing中图像处理元素,但是在开发avalonia应用时考虑跨平台特性,则必须有对应的跨平台替换方案。主要考虑Avalonia.Media.Imaging.Bitmap和SkiaSharp.SKBitmap

方案比对

特性维度Avalonia.Media.Imaging.BitmapSkiaSharp.SKBitmap
集成度与兼容性原生支持,与Avalonia控件和绑定机制无缝集成⚠️ 需额外安装 NuGet包,但API稳定且跨平台一致
功能丰富度提供日常UI操作(加载、显示、简单变换)支持高级滤镜、路径绘制、文本渲染、多种颜色空间等复杂图像处理
性能对常规UI操作进行了优化高性能,底层为C++实现的Skia库,复杂图形操作和渲染效率高
API 风格与学习曲线与WPF的System.Windows.Media.Imaging.BitmapImage类似,迁移成本低自成体系的API,需一定学习成本,但功能强大灵活
跨平台一致性依赖Avalonia的实现行为高度一致,各平台渲染结果相同
内存与资源管理与Avalonia UI元素生命周期绑定需留意手动管理SKBitmap等对象的释放(使用usingDispose
优选情况

1.图像的加载、显示、简单的缩放或裁剪

2.图像直接与Avalonia的Image控件绑定

3.希望尽量减少外部依赖,WPF改动较少

1.复杂的图像处理,如应用滤镜、模糊、锐化、颜色校正等

2.动态生成内容丰富的图片

3.极高的跨平台一致性

根据项目特性,考虑使用SkiaSharp.SKBitmap;最后选择Avalonia.Media.Imaging.Bitmap与SkiaSharp.SKBitmap结合的方案

1.考虑图片会绑定到ImageViewer控件,该控件数据源是IImage?类型Avalonia.Media.Imaging.Bitmap可以直接绑定,但是SkiaSharp.SKBitmap不可直接绑定,且avalonia中使用Avalonia.Media.Imaging.Bitmap改动较少;

2.考虑需要对图像进行图像处理,如灰度化,锐化等,所以使用SkiaSharp.SKBitmap

实现方案

1.将Avalonia的Bitmap转换为SkiaSharp的SKBitmap。

2.使用SkiaSharp进行图像处理。

......

3.将SkiaSharp的SKBitmap转换回Avalonia的Bitmap。

WPF迁移avalonia的图像部分常遇问题

1.OpenCvSharp.Extensions.BitmapConverter拓展包仅适用于Windows

OpenCvSharp.Extensions.BitmapConverter仅限用于Windows平台,因为WPF和avalonia的使用图像不同(System.Drawing.Bitmap vs Avalonia.Media.Imaging.Bitmap),所以需要实现一组

Mat ↔ Avalonia Bitmap相互转换的方法。

2.WPF 中的灰度处理使用矩阵ColorMatrix 转换为 SkiaSharp 颜色矩阵

要将 WPF 的 5×5 矩阵转换为 Skia 的 4×5 矩阵,如果使用HLSL着色器,则可能需要将矩阵转置(因为HLSL是列主序),并且需要将矩阵扩展矩阵(对于RGB和A的变换)

WPF的矩阵含义

new float[][] {new float[] {.711f, .7111f, .711f, 0, 0},  // 红色输出 = 0.711*R + 0.711*G + 0.711*B + 0*A + 0new float[] {.222f, .222f, .222f, 0, 0},  // 绿色输出 = 0.222*R + 0.222*G + 0.222*B + 0*A + 0new float[] {.111f, .111f, .111f, 0, 0},  // 蓝色输出 = 0.111*R + 0.111*G + 0.111*B + 0*A + 0new float[] {0, 0, 0, 1, 0},        // Alpha输出 = 0*R + 0*G + 0*B + 1*A + 0new float[] {0, 0, 0, 0, 1}         // 偏移量(通常为0,0,0,0,1)
}
  1. 转置这些行(行变列,列变行)
  2. 保持每行的第 5 个值(偏移量)不变

avalonia下变换后的矩阵转换

new float[] {0.711f, 0.222f, 0.111f, 0, 0,  // 第一列:红色系数0.711f, 0.222f, 0.111f, 0, 0,  // 第二列:绿色系数0.711f, 0.222f, 0.111f, 0, 0,  // 第三列:蓝色系数0,    0,    0,    1, 0   // 第四列:Alpha系数
}

显示效果

使用灰度化矩阵后

http://www.xdnf.cn/news/1426789.html

相关文章:

  • 基于SpringBoot的古典舞在线交流平台
  • C++革命性新特性:默认实例导出(exportDefault)让单例模式变得无比简单!
  • Redis 缓存雪崩实战:从监控告警到3层防护的完整修复
  • Docker镜像指南:从核心命令到离线迁移实战
  • ⸢ 肆 ⸥ ⤳ 默认安全:安全建设方案 ➭ a.信息安全基线
  • 工业视觉光源选色指南:白光通用、蓝光显瑕疵、红光能穿透,看完直接用
  • 《水浒智慧》(第一部:梁山头领那些事儿)读书笔记
  • 【面试场景题】外卖平台如何扛住高峰期上千qps订单查询流量
  • 【硬件测试】基于FPGA的16PSK+卷积编码Viterbi译码硬件片内测试,包含帧同步,信道,误码统计,可设置SNR
  • 数据结构之单链表的应用(一)
  • 服务器CPU飙高?排查步骤与工具推荐
  • 一、Scala 基础语法、变量与数据类型
  • 智能化企业级CRM系统开发实战:飞算JavaAI全流程体验
  • 苹果内部 AI聊天机器人“Asa”曝光,为零售员工打造专属A
  • vscode炒股插件-韭菜盒子AI版
  • Coze源码分析-工作空间-资源查询-前端源码
  • 基于RS-485接口的芯片的FPGA驱动程序
  • Unity图集 SpriteAltas 打包探究
  • 【游戏开发】Houdini相较于Blender在游戏开发上有什么优劣势?我该怎么选择开发工具?
  • 从全栈开发到微服务架构:一次真实面试的深度解析
  • 鸿蒙NEXT开发指南:Image、Video与Swiper组件全面解析
  • 20250901的学习笔记
  • Map + 函数式接口的策略模式
  • Java面试宝典:Redis高并发高可用(集群)
  • 【序列晋升】23 Spring Cloud Kubernetes 云原生架构的终极整合方案
  • Vue基础知识-Vue中:class与:style动态绑定样式
  • 【计算岗位解析:从代码到产品,这些角色如何“造”出数字世界?】
  • 威科夫与高频因子
  • (Redis)Redis 分布式锁及改进策略详解
  • Spring 控制器参数注解