本文告訴大家如何使用 win2d 給圖檔加上水印
本文告訴大家如何使用 win2d 給圖檔加上水印。
安裝
首先需要使用 Nuget 安裝 win2d ,安裝參見win10 uwp win2d
如果沒有更新 dot net core 那麼在運作可能會出現下面異常
System.TypeLoadException: Requested Windows Runtime type 'Microsoft.Graphics.Canvas.Text.CanvasTextLayout' is not registered
那麼直接更新 dot net core 到最新,然後清理項目就可以
獲得圖檔
要對圖檔處理,首先需要拿到圖檔,拿到圖檔的方法可以是從剪貼闆獲得或者使用檔案選取拿到。
如果是從剪貼闆拿到圖檔,需要把圖檔儲存到本地的臨時檔案夾,然後拿到檔案。
如果使用檔案選取拿到檔案,可以使用這個方法
var pick = new FileOpenPicker();
pick.FileTypeFilter.Add(".jpg");
pick.FileTypeFilter.Add(".png");
var file = await pick.PickSingleFileAsync();
注意字尾名用的是
.
+字尾名,這裡我寫的是很少的圖檔字尾名,實際上可以支援的圖檔字尾是很多。
建立圖檔
如果需要對圖檔處理,使用的是 CanvasRenderTarget ,可以看到這個類需要傳入兩個參數
ICanvasResourceCreatorWithDpi
,
Size
,我也就使用這個函數
在 win2d 使用圖檔需要 CanvasBitmap ,這個類不可以直接建立,需要通過
LoadAsync
、
CreateFromBytes
CreateFromColors
CreateFromSoftwareBitmap
這些方法來建立,下面就使用第一個方法建立。
第一個方法有很多重載,需要注意,如果不是解決方案裡的檔案,千萬不要使用檔案名或 URI 的方法,因為經常出現檔案無法通路。
如果不是解決方案裡的檔案,千萬不要使用 fileName 或 URI 的方法讀取圖檔,因為一般的檔案是沒有權限。即使使用 FilePick 拿到檔案,檔案的路徑也可能拿不到。
建議使用的方法是使用流的重載,在上面,已經拿到檔案,這時把檔案讀出來,傳入就可以
var duvDbecdgiu =
await CanvasBitmap.LoadAsync(new CanvasDevice(true), await _file.OpenAsync(FileAccessMode.Read));
處理圖檔
現在建立 CanvasRenderTarget 處理圖檔,在使用 CanvasRenderTarget 記得釋放,是以一般需要使用下面代碼
using (var canvasRenderTarget = new CanvasRenderTarget(duvDbecdgiu, duvDbecdgiu.Size))
建立一個圖檔處理,大小就和圖檔大小相同。
在圖檔添加文字的方法實際上和在 win2d 的其他處理相同,具體可以去看我的win2d部落格。
using (var dc = canvasRenderTarget.CreateDrawingSession())
{
dc.DrawImage(duvDbecdgiu);
dc.DrawText("lindexi",
new Vector2((float) (duvDbecdgiu.Size.Width / 2), (float) duvDbecdgiu.Size.Height/2), Colors.Black);
}
也許大家會覺得上面的
DrawImage
是做什麼的,剛才不是從圖檔建立的?實際上從圖檔建立,但是沒有畫圖檔,也就是在使用的時候需要先畫圖檔,然後畫出文字。
儲存
現在嘗試儲存一個圖檔,儲存需要讓使用者選一個檔案
var pick = new FileSavePicker();
pick.FileTypeChoices.Add("image", new List<string>() {".jpg"});
var file = await pick.PickSaveFileAsync();
儲存很簡單
await canvasRenderTarget.SaveAsync(await file.OpenAsync(FileAccessMode.ReadWrite),CanvasBitmapFileFormat.Jpeg);
注意儲存的格式可以是很多,但是字尾名需要和儲存的格式相同。
現在這個功能寫在圖床
歡迎大家通路我搭建的部落格 win2d 圖檔水印 我自己搭建的部落格會不斷更新
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuEzM4hDOvwFMuQzLcF2ctMmbtknYvwFbvwFdl5mLz52b0RXdiV2cuV2Ypx2Lc9CX6MHc0RHaiojIsJye.png)
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名林德熙(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我聯系。
部落格園部落格隻做備份,部落格釋出就不再更新,如果想看最新部落格,請到 https://blog.lindexi.com/
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuEzM4hDOvwFMuQzLcF2ctMmbtknYvwFbvwFdl5mLz52b0RXdiV2cuV2Ypx2Lc9CX6MHc0RHaiojIsJye.png)
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯系](mailto:[email protected])。