diff --git a/src/PicView.Avalonia/DragAndDrop/DragAndDropHelper.cs b/src/PicView.Avalonia/DragAndDrop/DragAndDropHelper.cs index 5cb15a2e..21f61db0 100644 --- a/src/PicView.Avalonia/DragAndDrop/DragAndDropHelper.cs +++ b/src/PicView.Avalonia/DragAndDrop/DragAndDropHelper.cs @@ -2,6 +2,7 @@ using System.Text; using Avalonia.Controls; using Avalonia.Input; +using Avalonia.Media.Imaging; using Avalonia.Platform.Storage; using Avalonia.Threading; using PicView.Avalonia.ImageHandling; @@ -178,7 +179,7 @@ await Dispatcher.UIThread.InvokeAsync(() => var thumb = await GetThumbnails.GetThumbAsync(path, SizeDefaults.WindowMinSize - 30) .ConfigureAwait(false); - await Dispatcher.UIThread.InvokeAsync(() => { _dragDropView?.UpdateThumbnail(thumb); }); + await Dispatcher.UIThread.InvokeAsync(() => { _dragDropView?.UpdateThumbnail(thumb as Bitmap); }); } } else diff --git a/src/PicView.Avalonia/Gallery/GalleryFunctions.cs b/src/PicView.Avalonia/Gallery/GalleryFunctions.cs index 8222e6e5..ccbf69f9 100644 --- a/src/PicView.Avalonia/Gallery/GalleryFunctions.cs +++ b/src/PicView.Avalonia/Gallery/GalleryFunctions.cs @@ -1,5 +1,6 @@ using Avalonia.Layout; using Avalonia.Media; +using Avalonia.Svg.Skia; using Avalonia.Threading; using PicView.Avalonia.ImageHandling; using PicView.Avalonia.Navigation; @@ -342,9 +343,17 @@ await Dispatcher.UIThread.InvokeAsync(() => await vm.ImageIterator.IterateToIndex(vm.ImageIterator.ImagePaths.IndexOf(fileInfo.FullName)).ConfigureAwait(false); }; galleryListBox.Items.Insert(index, galleryItem); - ImageFunctions.SetImage(thumb, galleryItem.GalleryImage, - fileInfo.Extension.Equals("svg", StringComparison.OrdinalIgnoreCase) || - fileInfo.Extension.Equals("svgz", StringComparison.OrdinalIgnoreCase) ? ImageType.Svg : ImageType.Bitmap); + var isSvg = fileInfo.Extension.Equals(".svg", StringComparison.OrdinalIgnoreCase) || + fileInfo.Extension.Equals(".svgz", StringComparison.OrdinalIgnoreCase); + if (isSvg) + { + galleryItem.GalleryImage.Source = new SvgImage + { Source = SvgSource.Load(fileInfo.FullName) }; + } + else if (thumb is not null) + { + galleryItem.GalleryImage.Source = thumb; + } }, DispatcherPriority.Render); return true; } diff --git a/src/PicView.Avalonia/Gallery/GalleryLoad.cs b/src/PicView.Avalonia/Gallery/GalleryLoad.cs index 7e8eb57e..1050e194 100644 --- a/src/PicView.Avalonia/Gallery/GalleryLoad.cs +++ b/src/PicView.Avalonia/Gallery/GalleryLoad.cs @@ -1,4 +1,5 @@ -using Avalonia.Threading; +using Avalonia.Svg.Skia; +using Avalonia.Threading; using PicView.Avalonia.ImageHandling; using PicView.Avalonia.UI; using PicView.Avalonia.ViewModels; @@ -182,6 +183,13 @@ await Parallel.ForAsync(startIndex, endIndex, options, async (i, _) => var thumb = await GetThumbnails.GetThumbAsync(fileInfos[i].FullName, (uint)galleryItemSize, fileInfos[i]); var thumbData = GalleryThumbInfo.GalleryThumbHolder.GetThumbData(fileInfos[i]); + var isSvg = fileInfos[i].Extension.Equals(".svg", StringComparison.OrdinalIgnoreCase) || + fileInfos[i].Extension.Equals(".svgz", StringComparison.OrdinalIgnoreCase); + + if (isSvg) + { + Console.WriteLine($"{fileInfos[i].FullName} is svg"); + } await Dispatcher.UIThread.InvokeAsync(() => { @@ -194,11 +202,14 @@ await Dispatcher.UIThread.InvokeAsync(() => return; } - if (thumb is not null) + if (isSvg) + { + galleryItem.GalleryImage.Source = new SvgImage + { Source = SvgSource.Load(fileInfos[i].FullName) }; + } + else if (thumb is not null) { - ImageFunctions.SetImage(thumb, galleryItem.GalleryImage, - fileInfos[i].Extension.Equals("svg", StringComparison.OrdinalIgnoreCase) || - fileInfos[i].Extension.Equals("svgz", StringComparison.OrdinalIgnoreCase) ? ImageType.Svg : ImageType.Bitmap); + galleryItem.GalleryImage.Source = thumb; } galleryItem.FileLocation.Text = thumbData.FileLocation; diff --git a/src/PicView.Avalonia/ImageHandling/GetThumbnails.cs b/src/PicView.Avalonia/ImageHandling/GetThumbnails.cs index b4f76f52..67fb6272 100644 --- a/src/PicView.Avalonia/ImageHandling/GetThumbnails.cs +++ b/src/PicView.Avalonia/ImageHandling/GetThumbnails.cs @@ -44,6 +44,26 @@ public static class GetThumbnails fileInfo ??= new FileInfo(path); await using var fileStream = FileHelper.GetOptimizedFileStream(fileInfo); + + switch (Path.GetExtension(path).ToLowerInvariant()) + { + case ".webp": + case ".png": + case ".jpg": + case ".jpeg": + case ".jpe": + case ".bmp": + case ".jfif": + case ".ico": + case ".wbmp": + return Bitmap.DecodeToHeight(fileStream, (int)height); + + case ".svg": + case ".svgz": + return null; + } + + if (fileInfo.Length >= 2147483648) { // Fixes "The file is too long. This operation is currently limited to supporting files less than 2 gigabytes in size." diff --git a/src/PicView.Avalonia/ImageHandling/ImageFunctions.cs b/src/PicView.Avalonia/ImageHandling/ImageFunctions.cs index 84e2e445..18bf2638 100644 --- a/src/PicView.Avalonia/ImageHandling/ImageFunctions.cs +++ b/src/PicView.Avalonia/ImageHandling/ImageFunctions.cs @@ -1,7 +1,4 @@ using System.Diagnostics; -using Avalonia.Controls; -using Avalonia.Media.Imaging; -using Avalonia.Svg.Skia; using PicView.Core.FileHandling; using PicView.Core.ImageDecoding; @@ -9,16 +6,6 @@ namespace PicView.Avalonia.ImageHandling; public static class ImageFunctions { - public static void SetImage(object image, Image imageControl, ImageType imageType) - { - imageControl.Source = imageType switch - { - ImageType.Svg => new SvgImage { Source = SvgSource.Load(image as string) }, - ImageType.Bitmap => image as Bitmap, - _ => imageControl.Source - }; - } - public static bool IsAnimated(FileInfo fileInfo) { var frames = ImageFunctionHelper.GetImageFrames(fileInfo.FullName); diff --git a/src/PicView.Avalonia/Views/UC/DragDrogView.axaml.cs b/src/PicView.Avalonia/Views/UC/DragDrogView.axaml.cs index 404f12a9..77391e20 100644 --- a/src/PicView.Avalonia/Views/UC/DragDrogView.axaml.cs +++ b/src/PicView.Avalonia/Views/UC/DragDrogView.axaml.cs @@ -73,7 +73,8 @@ public void AddZipIcon() public void UpdateThumbnail(Bitmap image) { UpdateViewSize(); - if (DataContext is not MainViewModel vm) return; + if (DataContext is not MainViewModel vm || image is null) + return; var scale = CalculateScale(image.PixelSize.Width, image.PixelSize.Height, vm); UpdateContentHolder(image, scale);