1. 程式人生 > >win2d 圖片水印

win2d 圖片水印

graphic cli file cloud 剪貼板 filetype 需要 sync tps

本文告訴大家如何使用 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 ,可以看到這個類需要傳入兩個參數ICanvasResourceCreatorWithDpiSize,我也就使用這個函數

在 win2d 使用圖片需要 CanvasBitmap ,這個類不可以直接創建,需要通過LoadAsyncCreateFromBytesCreateFromColorsCreateFromSoftwareBitmap 這些方法來創建,下面就使用第一個方法創建。

第一個方法有很多重載,需要註意,如果不是解決方案裏的文件,千萬不要使用文件名或 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 圖片水印 我自己搭建的博客會不斷更新

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

win2d 圖片水印