2022年3月23日 星期三

for xamarin.form (IOS)--「 System.Drawing is not supported on this platform. 」

 最近有個繪圖的需求,是要在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」看起來不錯用,影音示範請看這裡

順便在此分享