From a91261435abf0fe8c64b1fc81dee59ce18dcbe89 Mon Sep 17 00:00:00 2001 From: Paddy Xu Date: Sun, 7 Mar 2021 19:02:08 +0100 Subject: [PATCH] Fix #825 properly --- .../AnimatedImage/AnimatedImage.cs | 4 +-- .../AnimatedImage/AnimationProvider.cs | 4 +-- .../AnimatedImage/Providers/APngProvider.cs | 6 ++-- .../AnimatedImage/Providers/DcrawProvider.cs | 2 +- .../AnimatedImage/Providers/GifProvider.cs | 6 ++-- .../Providers/ImageMagickProvider.cs | 4 +-- .../AnimatedImage/Providers/NativeProvider.cs | 6 ++-- .../QuickLook.Plugin.ImageViewer/Helper.cs | 30 +++++++++++++++++++ .../QuickLook.Plugin.ImageViewer/Plugin.cs | 2 +- 9 files changed, 47 insertions(+), 17 deletions(-) diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/AnimatedImage.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/AnimatedImage.cs index 9dcf46e6..f5780d1f 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/AnimatedImage.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/AnimatedImage.cs @@ -50,10 +50,10 @@ public void Dispose() private static AnimationProvider InitAnimationProvider(Uri path, MetaProvider meta) { - var ext = Path.GetExtension(path.OriginalString).ToLower(); + var ext = Path.GetExtension(path.LocalPath).ToLower(); var type = Providers.First(p => p.Key.Contains(ext) || p.Key.Contains("*")).Value; - var provider = type.CreateInstance(path.OriginalString, meta); + var provider = type.CreateInstance(path, meta); return provider; } diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/AnimationProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/AnimationProvider.cs index 13cf5391..ed6f773e 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/AnimationProvider.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/AnimationProvider.cs @@ -25,13 +25,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage { internal abstract class AnimationProvider : IDisposable { - protected AnimationProvider(string path, MetaProvider meta) + protected AnimationProvider(Uri path, MetaProvider meta) { Path = path; Meta = meta; } - public string Path { get; } + public Uri Path { get; } public MetaProvider Meta { get; } diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/APngProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/APngProvider.cs index bf488c0c..1c3360a4 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/APngProvider.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/APngProvider.cs @@ -37,16 +37,16 @@ internal class APngProvider : AnimationProvider private int _lastEffectivePreviousPreviousFrameIndex; private NativeProvider _nativeImageProvider; - public APngProvider(string path, MetaProvider meta) : base(path, meta) + public APngProvider(Uri path, MetaProvider meta) : base(path, meta) { - if (!IsAnimatedPng(path)) + if (!IsAnimatedPng(path.LocalPath)) { _nativeImageProvider = new NativeProvider(path, meta); Animator = _nativeImageProvider.Animator; return; } - var decoder = new APNGBitmap(path); + var decoder = new APNGBitmap(path.LocalPath); _baseFrame = decoder.DefaultImage; _frames = new List(decoder.Frames.Length); diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/DcrawProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/DcrawProvider.cs index 0a7c53b1..409edc16 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/DcrawProvider.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/DcrawProvider.cs @@ -21,7 +21,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers { internal class DcrawProvider : NativeProvider { - public DcrawProvider(string path, MetaProvider meta) : base(path, meta) + public DcrawProvider(Uri path, MetaProvider meta) : base(path, meta) { throw new NotImplementedException(); } diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/GifProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/GifProvider.cs index 46463bb9..5869f48f 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/GifProvider.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/GifProvider.cs @@ -33,15 +33,15 @@ internal class GifProvider : AnimationProvider private bool _isPlaying; private NativeProvider _nativeProvider; - public GifProvider(string path, MetaProvider meta) : base(path, meta) + public GifProvider(Uri path, MetaProvider meta) : base(path, meta) { - if (!ImageAnimator.CanAnimate(Image.FromFile(path))) + if (!ImageAnimator.CanAnimate(Image.FromFile(path.LocalPath))) { _nativeProvider = new NativeProvider(path, meta); return; } - _fileHandle = (Bitmap) Image.FromFile(path); + _fileHandle = (Bitmap) Image.FromFile(path.LocalPath); _fileHandle.SetResolution(DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Horizontal, DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Vertical); diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/ImageMagickProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/ImageMagickProvider.cs index bc3aebbd..41a7f4b7 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/ImageMagickProvider.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/ImageMagickProvider.cs @@ -30,7 +30,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers { internal class ImageMagickProvider : AnimationProvider { - public ImageMagickProvider(string path, MetaProvider meta) : base(path, meta) + public ImageMagickProvider(Uri path, MetaProvider meta) : base(path, meta) { Animator = new Int32AnimationUsingKeyFrames(); Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0, @@ -90,7 +90,7 @@ public override Task GetRenderedFrame(int index) try { - using (var mi = new MagickImage(Path, settings)) + using (var mi = new MagickImage(Path.LocalPath, settings)) { var profile = mi.GetColorProfile(); if (mi.ColorSpace == ColorSpace.RGB || mi.ColorSpace == ColorSpace.sRGB || diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/NativeProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/NativeProvider.cs index df9d4557..48c02f98 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/NativeProvider.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/NativeProvider.cs @@ -27,7 +27,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers { internal class NativeProvider : AnimationProvider { - public NativeProvider(string path, MetaProvider meta) : base(path, meta) + public NativeProvider(Uri path, MetaProvider meta) : base(path, meta) { Animator = new Int32AnimationUsingKeyFrames(); Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0, @@ -55,7 +55,7 @@ public override Task GetThumbnail(Size renderSize) { var img = new BitmapImage(); img.BeginInit(); - img.UriSource = new Uri(Path); + img.UriSource = Path; img.CacheOption = BitmapCacheOption.OnLoad; // specific renderSize to avoid .net's double to int conversion img.DecodePixelWidth = rotate ? decodeHeight : decodeWidth; @@ -94,7 +94,7 @@ public override Task GetRenderedFrame(int index) { var img = new BitmapImage(); img.BeginInit(); - img.UriSource = new Uri(Path); + img.UriSource = Path; img.CacheOption = BitmapCacheOption.OnLoad; img.DecodePixelWidth = (int) (rotate ? fullSize.Height : fullSize.Width); img.DecodePixelHeight = (int) (rotate ? fullSize.Width : fullSize.Height); diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Helper.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Helper.cs index ca6b80d9..81caee0d 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Helper.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Helper.cs @@ -15,7 +15,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using System; +using System.IO; using System.Reflection; +using System.Text; using System.Windows.Media.Imaging; using QuickLook.Common.Helpers; @@ -37,5 +40,32 @@ public static void DpiHack(BitmapSource img) dpiX?.SetValue(img, newDpiX); dpiY?.SetValue(img, newDpiY); } + + public static Uri FilePathToFileUrl(string filePath) + { + var uri = new StringBuilder(); + foreach (var v in filePath) + if (v >= 'a' && v <= 'z' || v >= 'A' && v <= 'Z' || v >= '0' && v <= '9' || + v == '+' || v == '/' || v == ':' || v == '.' || v == '-' || v == '_' || v == '~' || + v > '\x80') + uri.Append(v); + else if (v == Path.DirectorySeparatorChar || v == Path.AltDirectorySeparatorChar) + uri.Append('/'); + else + uri.Append($"%{(int) v:X2}"); + if (uri.Length >= 2 && uri[0] == '/' && uri[1] == '/') // UNC path + uri.Insert(0, "file:"); + else + uri.Insert(0, "file:///"); + + try + { + return new Uri(uri.ToString()); + } + catch + { + return null; + } + } } } \ No newline at end of file diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Plugin.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Plugin.cs index 89d1358c..e68254a8 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Plugin.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Plugin.cs @@ -86,7 +86,7 @@ public void View(string path, ContextObject context) ? $"{Path.GetFileName(path)}" : $"{size.Width}×{size.Height}: {Path.GetFileName(path)}"; - _ip.ImageUriSource = new Uri(path); + _ip.ImageUriSource = Helper.FilePathToFileUrl(path); } public void Cleanup()