From 2cda4606e33c394c742ad65164cfd161e2f1d6b2 Mon Sep 17 00:00:00 2001 From: Paddy Xu Date: Sat, 17 Oct 2020 18:06:28 +0200 Subject: [PATCH] Fix #759: fix thumbnail orientation for some camera models --- .../Providers/ImageMagickProvider.cs | 64 ++++++++++++++++--- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/ImageMagickProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/ImageMagickProvider.cs index 97b05ef..bc3aebb 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/ImageMagickProvider.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/ImageMagickProvider.cs @@ -40,6 +40,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers public override Task GetThumbnail(Size renderSize) { var fullSize = Meta.GetSize(); + var orientation = Meta.GetOrientation(); return new Task(() => { @@ -54,17 +55,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers img.BeginInit(); img.StreamSource = buffer; img.CacheOption = BitmapCacheOption.OnLoad; - //// specific renderSize to avoid .net's double to int conversion - //img.DecodePixelWidth = Math.Max(1, (int) Math.Floor(renderSize.Width)); - //img.DecodePixelHeight = Math.Max(1, (int) Math.Floor(renderSize.Height)); img.EndInit(); - var scaled = new TransformedBitmap(img, - new ScaleTransform(fullSize.Width / img.PixelWidth, fullSize.Height / img.PixelHeight)); + var transformed = RotateAndScaleThumbnail(img, orientation, fullSize); - Helper.DpiHack(scaled); - scaled.Freeze(); - return scaled; + Helper.DpiHack(transformed); + transformed.Freeze(); + return transformed; } } catch (Exception e) @@ -96,7 +93,8 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers using (var mi = new MagickImage(Path, settings)) { var profile = mi.GetColorProfile(); - if (mi.ColorSpace == ColorSpace.RGB || mi.ColorSpace == ColorSpace.sRGB || mi.ColorSpace == ColorSpace.scRGB) + if (mi.ColorSpace == ColorSpace.RGB || mi.ColorSpace == ColorSpace.sRGB || + mi.ColorSpace == ColorSpace.scRGB) if (profile?.Description != null && !profile.Description.Contains("sRGB")) mi.SetProfile(ColorProfile.SRGB); @@ -125,5 +123,53 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers public override void Dispose() { } + + private static TransformedBitmap RotateAndScaleThumbnail(BitmapImage image, Orientation orientation, + Size fullSize) + { + var swap = false; + + var transforms = new TransformGroup(); + + // some RAWs, like from RX100, have thumbnails already rotated. + if (fullSize.Height >= fullSize.Width && image.PixelHeight <= image.PixelWidth || + fullSize.Height < fullSize.Width && image.PixelHeight > image.PixelWidth) + switch (orientation) + { + case Orientation.TopRight: + transforms.Children.Add(new ScaleTransform(-1, 1, 0, 0)); + break; + case Orientation.BottomRight: + transforms.Children.Add(new RotateTransform(180)); + break; + case Orientation.BottomLeft: + transforms.Children.Add(new ScaleTransform(1, 1, 0, 0)); + break; + case Orientation.LeftTop: + transforms.Children.Add(new RotateTransform(90)); + transforms.Children.Add(new ScaleTransform(-1, 1, 0, 0)); + swap = true; + break; + case Orientation.RightTop: + transforms.Children.Add(new RotateTransform(90)); + swap = true; + break; + case Orientation.RightBottom: + transforms.Children.Add(new RotateTransform(270)); + transforms.Children.Add(new ScaleTransform(-1, 1, 0, 0)); + swap = true; + break; + case Orientation.LeftBottom: + transforms.Children.Add(new RotateTransform(270)); + swap = true; + break; + } + + transforms.Children.Add(swap + ? new ScaleTransform(fullSize.Width / image.PixelHeight, fullSize.Height / image.PixelWidth) + : new ScaleTransform(fullSize.Width / image.PixelWidth, fullSize.Height / image.PixelHeight)); + + return new TransformedBitmap(image, transforms); + } } } \ No newline at end of file