最近有個繪圖的需求,是要在contentpage顯示一些類似stack chart
原先設計好了用system.drawing 套件的image/graphics的一些繪製工作(輸出byte array,跟xamarin form page無關)的元件.
然而....移植到xamarion.ios就現問題了
ex:
var image=Image.FromStream(byteArra);
就會遇到平台不支援的問題
雖然是有找到類似從stream 取得native image的方式,但是那又衍生出UIImage /Android Bitmap如何轉換成system.drawing.image的問題
你或許會說「不是有libgdiplus了嗎?安裝那個套件應該可以了吧」答案是linux可以,可是ios就是不行
最後解決方式就是用skiasharp套件了
是可以用SKCanvasView直接在上面繪製,參考此例
(而且SkCanvasview也支援gesture!! 參考這個skcanvasview繪圖板範例)
可是之前寫的元件真的是不用傳入content page的東西,只是要收byte array再顯示到xamarin.form.image裡
如何改才行!?
答案,還是在canva裡,只是要用surface來作存檔輸出
----example------
var skImg = SKImage.FromEncodedData(backgroundPngByteArray);
var info = new SKImageInfo(472, 866);//底圖寬高
using (var surface = SKSurface.Create(info, info.RowBytes)) {
SKCanvas canvas = surface.Canvas;
//繪製底圖
canvas.DrawBitmap(SKBitmap.FromImage(skImg), 0, 0, null);
...
...人生如畫布,自己是畫家,精彩好壞盡在自我.....
....
canvas.Flush();
canvas.Save();
surface.Flush();
//以下兩行不能少,直接拿「surface.Snapshot().EncodedData」來用是null的,要小心
var snapshot = surface.Snapshot();
var encodeData = snapshot.Encode();
return encodeData.ToArray(); 最後,輸出byte array,就可以給之前的imageview做source了
}
---------------------
先前一直堅持一定要用system.drawing,試了一堆東西花了二個工作日,都沒有適合的
(實在不想動之前寫好的元件)
最後,長痛不如短痛,直接去元件裡下手,改用Skiasharp,把一些原本的System.Draw.Graphics.Draw...改用skcanvas.Draw....
一下子半天就改好了 .
早知道就用skiasharp了.
同場加映--在這次修改補完計畫中,無意間遇到一個類似手繪「繪圖板/簽名區」的元件--他叫「DrawingView」看起來不錯用,影音示範請看這裡
順便在此分享