From 19d76dc0a9fab202dec1cbef1ed580d54033c190 Mon Sep 17 00:00:00 2001 From: lxy829 <3346435289@qq.com> Date: Thu, 24 Aug 2023 18:53:42 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20IcoTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/avatars/gameicos/origin.png | Bin 0 -> 1105 bytes res/avatars/gameicos/steam.png | Bin 0 -> 6413 bytes src/BD.WTTS.UnitTest/IcoTest.cs | 51 +++++++++++++++++++------------- 3 files changed, 31 insertions(+), 20 deletions(-) create mode 100644 res/avatars/gameicos/origin.png create mode 100644 res/avatars/gameicos/steam.png diff --git a/res/avatars/gameicos/origin.png b/res/avatars/gameicos/origin.png new file mode 100644 index 0000000000000000000000000000000000000000..6ec3dad044da4daa6ac1ba582dd1711d95e25e15 GIT binary patch literal 1105 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 literal 0 HcmV?d00001 diff --git a/src/BD.WTTS.UnitTest/IcoTest.cs b/src/BD.WTTS.UnitTest/IcoTest.cs index 4ef6ab38c..336686d56 100644 --- a/src/BD.WTTS.UnitTest/IcoTest.cs +++ b/src/BD.WTTS.UnitTest/IcoTest.cs @@ -1,3 +1,4 @@ +using DynamicData; using SkiaSharp; namespace BD.WTTS.UnitTest; @@ -55,30 +56,29 @@ public sealed class IcoTest } } - //static IEnumerable G(int size, int[] dw) - //{ - // foreach (var item in dw) - // { - // if (item <= size) yield return item; - // } - //} - [Test] public void CreateShortcutIcon() { var logo512Path = Path.Combine(ProjectUtils.ProjPath, "res", "icons", "app", "v3", "Logo_512.png"); + var gameicoPath = Path.Combine(ProjectUtils.ProjPath, "res", "avatars", "gameicos", "origin.png"); var imgDirInfo = new DirectoryInfo(Path.Combine(ProjectUtils.ProjPath, "res", "avatars")); + using var logo512Bitmap = SKBitmap.Decode(logo512Path); + using var gameBitmap = SKBitmap.Decode(gameicoPath); + + var gear = new[] { 512, 256, 128, 96, 64, 48, 32, 24, 16 }; var saveDirPath = Path.Combine(assemblyDir, "avatars"); IOPath.DirCreateByNotExists(saveDirPath); + foreach (var img in imgDirInfo.GetFiles()) { SKBitmap[]? bitmaps = null; using var imgBitmap = SKBitmap.Decode(img.FullName); - using var fBitmap = ResizeImage(imgBitmap, logo512Bitmap); - - bitmaps = new[] { fBitmap }.Concat(new[] { 256, 128, 96, 64, 48, 32, 24, 16 } + var allSize = GetImgResolutionPower(imgBitmap.Width, gear); + var maxSize = allSize.Max(); + using var fBitmap = ResizeImage(imgBitmap, gameBitmap, maxSize); + bitmaps = new[] { fBitmap }.Concat(allSize.Where(x => x != maxSize) .Select(x => fBitmap.Resize(new SKSizeI { Height = x, Width = x }, SKFilterQuality.High))) .ToArray(); @@ -91,23 +91,34 @@ public sealed class IcoTest FileShare.ReadWrite | FileShare.Delete); IcoEncoder.Encode(fs, bitmaps); TestContext.WriteLine(savePath); + + if (bitmaps != null) + bitmaps.ForEach(x => x.Dispose()); } } - static SKBitmap ResizeImage(SKBitmap image, SKBitmap icoIcon) + static SKBitmap ResizeImage(SKBitmap image, SKBitmap icoIcon, int size) { - int icoWidth = icoIcon.Width / 4; - int icoHeight = icoIcon.Height / 4; - int watermarkLeft = icoIcon.Width - icoWidth; - int watermarkTop = icoIcon.Height - icoHeight; + int icoWidth = size / 4; + int icoHeight = size / 4; - SKBitmap scaledImage = new(icoIcon.Width, icoIcon.Height); + int watermarkLeft = size - icoWidth; + int watermarkTop = size - icoHeight; + + SKBitmap scaledImage = new(size, size); image.ScalePixels(scaledImage, SKFilterQuality.High); using SKCanvas canvas = new(scaledImage); - using SKPaint paint = new(); - paint.Color = paint.Color.WithAlpha(10); - canvas.DrawBitmap(icoIcon, new SKRect(watermarkLeft, watermarkTop, watermarkLeft + icoWidth, watermarkTop + icoHeight), paint); + canvas.DrawBitmap(icoIcon, new SKRect(watermarkLeft, watermarkTop, watermarkLeft + icoWidth, watermarkTop + icoHeight)); return scaledImage; } + + static IEnumerable GetImgResolutionPower(int size, int[] rp) + { + foreach (var item in rp) + { + if (item <= size) yield return item; + } + } + }