Skip to content

Commit

Permalink
use Bitmap.DecodeToHeight for thumbnails generation, fix svg images i…
Browse files Browse the repository at this point in the history
…n gallery thumbnails, refactor
  • Loading branch information
Ruben2776 committed Oct 23, 2024
1 parent 55234ca commit 27370f5
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 23 deletions.
3 changes: 2 additions & 1 deletion src/PicView.Avalonia/DragAndDrop/DragAndDropHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
15 changes: 12 additions & 3 deletions src/PicView.Avalonia/Gallery/GalleryFunctions.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
21 changes: 16 additions & 5 deletions src/PicView.Avalonia/Gallery/GalleryLoad.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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(() =>
{
Expand All @@ -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;
Expand Down
20 changes: 20 additions & 0 deletions src/PicView.Avalonia/ImageHandling/GetThumbnails.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down
13 changes: 0 additions & 13 deletions src/PicView.Avalonia/ImageHandling/ImageFunctions.cs
Original file line number Diff line number Diff line change
@@ -1,24 +1,11 @@
using System.Diagnostics;
using Avalonia.Controls;
using Avalonia.Media.Imaging;
using Avalonia.Svg.Skia;
using PicView.Core.FileHandling;
using PicView.Core.ImageDecoding;

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);
Expand Down
3 changes: 2 additions & 1 deletion src/PicView.Avalonia/Views/UC/DragDrogView.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 27370f5

Please sign in to comment.