天天看點

win2d 圖檔水印

本文告訴大家如何使用 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 圖檔水印 我自己搭建的部落格會不斷更新

win2d 圖檔水印

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名林德熙(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我聯系。

部落格園部落格隻做備份,部落格釋出就不再更新,如果想看最新部落格,請到 https://blog.lindexi.com/

win2d 圖檔水印

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯系](mailto:[email protected])。