using System; using 常用工具集.Base; using Avalonia.Media.Imaging; using SkiaSharp; using Ursa.Controls; using Avalonia.Platform.Storage; using System.Linq; using System.IO; using ImageMagick; using static System.Runtime.InteropServices.JavaScript.JSType; namespace 常用工具集.ViewModel._03图片相关 { public class 图片转ICOViewModel : ViewModelBase { public string ImagePath { get; set; } public Bitmap ImageSource { get; set; } public DelegateCommand SelectImageCmd { get; set; } public DelegateCommand ExportCmd { get; set; } public 图片转ICOViewModel() { SelectImageCmd = new DelegateCommand(SelectImageCmdFunc); ExportCmd = new DelegateCommand(ExportCmdFunc); } private async void SelectImageCmdFunc(object obj) { var sp = GlobalValues.StorageProvider; if (sp is null) return; FilePickerOpenOptions options = new FilePickerOpenOptions(); options.Title = "选择图片"; options.AllowMultiple = false; options.FileTypeFilter = [FilePickerFileTypes.ImageAll]; var result = await sp.OpenFilePickerAsync(options); if (result == null || result.Count == 0) return; ImagePath = result.FirstOrDefault()?.Path.LocalPath; ImageSource = new Bitmap(ImagePath); } private async void ExportCmdFunc(object obj) { int size = Convert.ToInt32(obj); SKBitmap sbitmap = SKBitmap.Decode(ImagePath); SKBitmap bitmap = ResizeImage(sbitmap, size, size); //Icon icon = ConvertToIcon(bitmap); //IconDir icon = new IconDir(); //icon.AddImage(bitmap, bitmap.Width, bitmap.Height); var sp = GlobalValues.StorageProvider; if (sp is null) return; var result = await sp.OpenFolderPickerAsync(new FolderPickerOpenOptions() { Title = "请选择要生成的目录", AllowMultiple = false, }); if (result == null || result.Count == 0) { await MessageBox.ShowAsync("文件夹路径不能为空"); return; } string filePath = result.FirstOrDefault()?.Path.LocalPath; if (!filePath.EndsWith("/")) { filePath += "/"; } string fileName = "favicon_" + size + "_" + DateTime.Now.ToString("yyyyMMddHHmmss"); byte[] bytes = null; using (MemoryStream stream = new MemoryStream()) { SKData data = bitmap.Encode(SKEncodedImageFormat.Png, 100); data.SaveTo(stream); bytes = stream.ToArray(); } using (MemoryStream stream = new MemoryStream(bytes)) { using (MagickImage image = new MagickImage(stream)) { image.Format = MagickFormat.Ico; image.Write(filePath + fileName + ".ico"); } } await MessageBox.ShowAsync("生成成功"); //icon.Dispose(); bitmap.Dispose(); sbitmap.Dispose(); } /// /// 图片缩放 /// /// /// /// /// public static SKBitmap ResizeImage(SKBitmap bmp, int newW, int newH) { try { SKBitmap b = new SKBitmap(newW, newH, SKColorType.Argb4444, SKAlphaType.Opaque); SKCanvas g = new SKCanvas(b); g.DrawBitmap(bmp, new SKRect(0, 0, newW, newH)); g.Dispose(); return b; } catch { return null; } } } }