從WPF遷移到avalonia中,對于圖像處理部分,在WPF常用System.Windows.Drawing中圖像處理元素,但是在開發avalonia應用時考慮跨平臺特性,則必須有對應的跨平臺替換方案。主要考慮Avalonia.Media.Imaging.Bitmap和SkiaSharp.SKBitmap
方案比對
特性維度 | Avalonia.Media.Imaging.Bitmap | SkiaSharp.SKBitmap |
---|---|---|
集成度與兼容性 | 原生支持,與Avalonia控件和綁定機制無縫集成 | ?? 需額外安裝 NuGet包,但API穩定且跨平臺一致 |
功能豐富度 | 提供日常UI操作(加載、顯示、簡單變換) | 支持高級濾鏡、路徑繪制、文本渲染、多種顏色空間等復雜圖像處理 |
性能 | 對常規UI操作進行了優化 | 高性能,底層為C++實現的Skia庫,復雜圖形操作和渲染效率高 |
API 風格與學習曲線 | 與WPF的System.Windows.Media.Imaging.BitmapImage 類似,遷移成本低 | 自成體系的API,需一定學習成本,但功能強大靈活 |
跨平臺一致性 | 依賴Avalonia的實現 | 行為高度一致,各平臺渲染結果相同 |
內存與資源管理 | 與Avalonia UI元素生命周期綁定 | 需留意手動管理SKBitmap 等對象的釋放(使用using 或Dispose ) |
優選情況 | 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)
}
- 轉置這些行(行變列,列變行)
- 保持每行的第 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系數
}
顯示效果
使用灰度化矩陣后