using modified exiv2-ql (QL-Win/exiv2@cf560437bb) to detect Exif; switch from NConvert to Magick.NET

This commit is contained in:
Paddy Xu
2020-05-01 19:02:15 +03:00
parent 208c5d5391
commit b98f8e5ec6
36 changed files with 400 additions and 5612 deletions

View File

@@ -37,7 +37,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
private int _lastEffectivePreviousPreviousFrameIndex;
private NativeImageProvider _nativeImageProvider;
public APngAnimationProvider(string path, NConvert meta) : base(path, meta)
public APngAnimationProvider(string path, MetaProvider meta) : base(path, meta)
{
if (!IsAnimatedPng(path))
{
@@ -68,12 +68,18 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
}
}
public override Task<BitmapSource> GetThumbnail(Size size, Size fullSize)
public override Task<BitmapSource> GetThumbnail(Size renderSize)
{
if (_nativeImageProvider != null)
return _nativeImageProvider.GetThumbnail(size, fullSize);
return _nativeImageProvider.GetThumbnail(renderSize);
return new Task<BitmapSource>(() => _baseFrame.GetBitmapSource());
return new Task<BitmapSource>(() =>
{
var bs = _baseFrame.GetBitmapSource();
bs.Freeze();
return bs;
});
}
public override Task<BitmapSource> GetRenderedFrame(int index)

View File

@@ -48,7 +48,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
public event EventHandler ImageLoaded;
public event EventHandler DoZoomToFit;
private static AnimationProvider LoadFullImageCore(Uri path, NConvert meta)
private static AnimationProvider InitAnimationProvider(Uri path, MetaProvider meta)
{
var ext = Path.GetExtension(path.LocalPath).ToLower();
var type = Providers.First(p => p.Key.Contains(ext) || p.Key.Contains("*")).Value;
@@ -69,7 +69,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
new UIPropertyMetadata(null, AnimationUriChanged));
public static readonly DependencyProperty MetaProperty =
DependencyProperty.Register("Meta", typeof(NConvert), typeof(AnimatedImage));
DependencyProperty.Register("Meta", typeof(MetaProvider), typeof(AnimatedImage));
public static readonly DependencyProperty ContextObjectProperty =
DependencyProperty.Register("ContextObject", typeof(ContextObject), typeof(AnimatedImage));
@@ -86,9 +86,9 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
set => SetValue(AnimationUriProperty, value);
}
public NConvert Meta
public MetaProvider Meta
{
private get => (NConvert) GetValue(MetaProperty);
private get => (MetaProvider) GetValue(MetaProperty);
set => SetValue(MetaProperty, value);
}
@@ -106,13 +106,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
//var thumbnail = instance.Meta?.GetThumbnail(true);
//instance.Source = thumbnail;
instance._animation = LoadFullImageCore((Uri) ev.NewValue, instance.Meta);
instance._animation = InitAnimationProvider((Uri) ev.NewValue, instance.Meta);
ShowThumbnailAndStartAnimation(instance);
}
private static void ShowThumbnailAndStartAnimation(AnimatedImage instance)
{
var task = instance._animation.GetThumbnail(instance.ContextObject.PreferredSize, instance.Meta.GetSize());
var task = instance._animation.GetThumbnail(instance.ContextObject.PreferredSize);
if (task == null) return;
task.ContinueWith(_ => instance.Dispatcher.Invoke(() =>
@@ -121,8 +121,12 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
return;
instance.Source = _.Result;
instance.DoZoomToFit?.Invoke(instance, new EventArgs());
instance.ImageLoaded?.Invoke(instance, new EventArgs());
if (_.Result != null)
{
instance.DoZoomToFit?.Invoke(instance, new EventArgs());
instance.ImageLoaded?.Invoke(instance, new EventArgs());
}
instance.BeginAnimation(AnimationFrameIndexProperty, instance._animation?.Animator);
}));
@@ -141,8 +145,18 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
task.ContinueWith(_ => instance.Dispatcher.Invoke(() =>
{
if (!instance._disposing)
instance.Source = _.Result;
if (instance._disposing)
return;
var firstLoad = instance.Source == null;
instance.Source = _.Result;
if (firstLoad)
{
instance.DoZoomToFit?.Invoke(instance, new EventArgs());
instance.ImageLoaded?.Invoke(instance, new EventArgs());
}
}));
task.Start();
}

View File

@@ -25,7 +25,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
{
internal abstract class AnimationProvider : IDisposable
{
protected AnimationProvider(string path, NConvert meta)
protected AnimationProvider(string path, MetaProvider meta)
{
Path = path;
Meta = meta;
@@ -33,13 +33,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
public string Path { get; }
public NConvert Meta { get; }
public MetaProvider Meta { get; }
public Int32AnimationUsingKeyFrames Animator { get; protected set; }
public abstract void Dispose();
public abstract Task<BitmapSource> GetThumbnail(Size size, Size fullSize);
public abstract Task<BitmapSource> GetThumbnail(Size renderSize);
public abstract Task<BitmapSource> GetRenderedFrame(int index);
}

View File

@@ -21,6 +21,7 @@ using System.Threading.Tasks;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using QuickLook.Common.ExtensionMethods;
using QuickLook.Common.Helpers;
using Size = System.Windows.Size;
namespace QuickLook.Plugin.ImageViewer.AnimatedImage
@@ -31,10 +32,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
private BitmapSource _frame;
private bool _isPlaying;
public GifAnimationProvider(string path, NConvert meta) : base(path, meta)
public GifAnimationProvider(string path, MetaProvider meta) : base(path, meta)
{
_fileHandle = (Bitmap) Image.FromFile(path);
_fileHandle.SetResolution(DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Horizontal,
DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Vertical);
Animator = new Int32AnimationUsingKeyFrames {RepeatBehavior = RepeatBehavior.Forever};
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0))));
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(10))));
@@ -53,7 +57,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
_frame = null;
}
public override Task<BitmapSource> GetThumbnail(Size size, Size fullSize)
public override Task<BitmapSource> GetThumbnail(Size renderSize)
{
return new Task<BitmapSource>(() =>
{

View File

@@ -1,4 +1,4 @@
// Copyright © 2018 Paddy Xu
// Copyright © 2020 Paddy Xu
//
// This file is part of QuickLook program.
//
@@ -16,49 +16,53 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using ImageMagick;
using QuickLook.Common.Helpers;
namespace QuickLook.Plugin.ImageViewer.AnimatedImage
{
internal class NConvertImageProvider : AnimationProvider
internal class ImageMagickProvider : AnimationProvider
{
public NConvertImageProvider(string path, NConvert meta) : base(path, meta)
public ImageMagickProvider(string path, MetaProvider meta) : base(path, meta)
{
Animator = new Int32AnimationUsingKeyFrames();
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0,
KeyTime.FromTimeSpan(TimeSpan.Zero)));
}
public override Task<BitmapSource> GetThumbnail(Size size, Size fullSize)
public override Task<BitmapSource> GetThumbnail(Size renderSize)
{
var decodeWidth = (int) Math.Round(fullSize.Width *
Math.Min(size.Width / 2 / fullSize.Width,
size.Height / 2 / fullSize.Height));
var decodeHeight = (int) Math.Round(fullSize.Height / fullSize.Width * decodeWidth);
var fullSize = Meta.GetSize();
return new Task<BitmapSource>(() =>
{
try
{
using (var ms = Meta.GetTiffStream(true))
using (var buffer = new MemoryStream(Meta.GetThumbnail()))
{
if (buffer.Length == 0)
return null;
var img = new BitmapImage();
img.BeginInit();
img.StreamSource = ms;
img.StreamSource = buffer;
img.CacheOption = BitmapCacheOption.OnLoad;
img.DecodePixelWidth = decodeWidth;
img.DecodePixelHeight = decodeHeight; // specific size to avoid .net's double to int conversion
//// 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));
scaled.Freeze();
Helper.DpiHack(scaled);
scaled.Freeze();
return scaled;
}
}
@@ -72,17 +76,27 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
public override Task<BitmapSource> GetRenderedFrame(int index)
{
var fullSize = Meta.GetSize();
return new Task<BitmapSource>(() =>
{
try
{
using (var ms = Meta.GetTiffStream(false))
using (var mi = new MagickImage(Path))
{
var img = new BitmapImage();
img.BeginInit();
img.StreamSource = ms;
img.CacheOption = BitmapCacheOption.OnLoad;
img.EndInit();
var profile = mi.GetColorProfile();
if (profile?.Description != null && !profile.Description.Contains("sRGB"))
mi.SetProfile(ColorProfile.SRGB);
mi.AutoOrient();
if (mi.Width != (int) fullSize.Width || mi.Height != (int) fullSize.Height)
mi.Resize((int) fullSize.Width, (int) fullSize.Height);
mi.Density = new Density(DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Horizontal,
DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Vertical);
var img = mi.ToBitmapSource(BitmapDensity.Use);
img.Freeze();
return img;

View File

@@ -27,19 +27,25 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
{
internal class NativeImageProvider : AnimationProvider
{
public NativeImageProvider(string path, NConvert meta) : base(path, meta)
public NativeImageProvider(string path, MetaProvider meta) : base(path, meta)
{
Animator = new Int32AnimationUsingKeyFrames();
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0,
KeyTime.FromTimeSpan(TimeSpan.Zero)));
}
public override Task<BitmapSource> GetThumbnail(Size size, Size fullSize)
public override Task<BitmapSource> GetThumbnail(Size renderSize)
{
var decodeWidth = (int) Math.Round(fullSize.Width *
Math.Min(size.Width / 2 / fullSize.Width,
size.Height / 2 / fullSize.Height));
var decodeHeight = (int) Math.Round(fullSize.Height / fullSize.Width * decodeWidth);
var fullSize = Meta.GetSize();
//var decodeWidth = (int) Math.Round(fullSize.Width *
// Math.Min(renderSize.Width / 2 / fullSize.Width,
// renderSize.Height / 2 / fullSize.Height));
//var decodeHeight = (int) Math.Round(fullSize.Height / fullSize.Width * decodeWidth);
var decodeWidth =
(int) Math.Round(Math.Min(Meta.GetSize().Width, Math.Max(1d, Math.Floor(renderSize.Width))));
var decodeHeight =
(int) Math.Round(Math.Min(Meta.GetSize().Height, Math.Max(1d, Math.Floor(renderSize.Height))));
var orientation = Meta.GetOrientation();
var rotate = ShouldRotate(orientation);
@@ -51,18 +57,22 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
img.BeginInit();
img.UriSource = new Uri(Path);
img.CacheOption = BitmapCacheOption.OnLoad;
// specific renderSize to avoid .net's double to int conversion
img.DecodePixelWidth = rotate ? decodeHeight : decodeWidth;
img.DecodePixelHeight = rotate ? decodeWidth : decodeHeight; // specific size to avoid .net's double to int conversion
img.DecodePixelHeight = rotate ? decodeWidth : decodeHeight;
img.EndInit();
var scaled = rotate ?
new TransformedBitmap(img,
var scaled = rotate
? new TransformedBitmap(img,
new ScaleTransform(fullSize.Height / img.PixelWidth, fullSize.Width / img.PixelHeight))
: new TransformedBitmap(img,
new ScaleTransform(fullSize.Width / img.PixelWidth, fullSize.Height / img.PixelHeight));
var rotated = ApplyTransformFromExif(scaled, orientation);
Helper.DpiHack(rotated);
rotated.Freeze();
return rotated;
}
catch (Exception e)
@@ -75,6 +85,9 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
public override Task<BitmapSource> GetRenderedFrame(int index)
{
var fullSize = Meta.GetSize();
var rotate = ShouldRotate(Meta.GetOrientation());
return new Task<BitmapSource>(() =>
{
try
@@ -83,9 +96,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
img.BeginInit();
img.UriSource = new Uri(Path);
img.CacheOption = BitmapCacheOption.OnLoad;
img.DecodePixelWidth = (int) (rotate ? fullSize.Height : fullSize.Width);
img.DecodePixelHeight = (int) (rotate ? fullSize.Width : fullSize.Height);
img.EndInit();
var img2 = ApplyTransformFromExif(img, Meta.GetOrientation());
Helper.DpiHack(img2);
img2.Freeze();
return img2;
@@ -100,13 +117,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
private static bool ShouldRotate(Orientation orientation)
{
bool rotate = false;
var rotate = false;
switch (orientation)
{
case Orientation.LeftTop:
case Orientation.RightTop:
case Orientation.RightBottom:
case Orientation.Leftbottom:
case Orientation.LeftBottom:
rotate = true;
break;
}
@@ -137,7 +154,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
return new TransformedBitmap(
new TransformedBitmap(image, new RotateTransform(270)),
new ScaleTransform(-1, 1, 0, 0));
case Orientation.Leftbottom:
case Orientation.LeftBottom:
return new TransformedBitmap(image, new RotateTransform(270));
}

View File

@@ -0,0 +1,41 @@
// Copyright © 2020 Paddy Xu
//
// This file is part of QuickLook program.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System.Reflection;
using System.Windows.Media.Imaging;
using QuickLook.Common.Helpers;
namespace QuickLook.Plugin.ImageViewer
{
internal class Helper
{
public static void DpiHack(BitmapSource img)
{
// a dirty hack... but is the fastest
var newDpiX = (double) DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Horizontal;
var newDpiY = (double) DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Vertical;
var dpiX = img.GetType().GetField("_dpiX",
BindingFlags.NonPublic | BindingFlags.Instance);
var dpiY = img.GetType().GetField("_dpiY",
BindingFlags.NonPublic | BindingFlags.Instance);
dpiX?.SetValue(img, newDpiX);
dpiY?.SetValue(img, newDpiY);
}
}
}

View File

@@ -76,23 +76,37 @@
</Border.Resources>
</Border>
<Button x:Name="buttonMeta" Style="{StaticResource CaptionButtonStyle}" Width="24" Height="24"
<Button x:Name="buttonMeta" Width="24" Height="24" Style="{StaticResource CaptionButtonStyle}"
HorizontalAlignment="Right" VerticalAlignment="Top"
Visibility="{Binding ElementName=imagePanel, Path=MetaIconVisibility}"
Margin="0,8,8,0" Content="&#xE946;" />
Margin="0,8,40,0" Content="&#xE946;" />
<Button x:Name="buttonBackgroundColour" Style="{StaticResource CaptionButtonStyle}" Width="24" Height="24"
HorizontalAlignment="Right" VerticalAlignment="Top"
Visibility="{Binding ElementName=imagePanel, Path=BackgroundVisibility}"
Margin="0,8,40,0" Content="&#xEF1F;" />
Margin="0,8,8,0" Content="&#xEF1F;" />
<TextBlock x:Name="textMeta" IsHitTestVisible="False" Visibility="Collapsed" HorizontalAlignment="Right"
<TextBlock x:Name="textMeta" IsHitTestVisible="False" HorizontalAlignment="Right"
VerticalAlignment="Top" FontSize="11"
Padding="5,5,5,5" Margin="0,40,8,0" Background="{DynamicResource CaptionBackground}"
Foreground="{DynamicResource WindowTextForeground}">
<TextBlock.Inlines>
<Run FontWeight="SemiBold">Camera maker</Run><Run>:&#160;</Run><Run>SONY</Run>
<Run FontWeight="SemiBold">Camera maker</Run>
<Run>:&#160;</Run>
<Run>SONY</Run>
</TextBlock.Inlines>
<TextBlock.Style>
<Style>
<Style.Setters>
<Setter Property="TextBlock.Visibility" Value="Collapsed" />
</Style.Setters>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=buttonMeta,Path=IsMouseOver}" Value="True">
<Setter Property="TextBlock.Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</UserControl>

View File

@@ -31,6 +31,7 @@ using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using QuickLook.Common.Annotations;
using QuickLook.Common.ExtensionMethods;
using QuickLook.Common.Helpers;
using QuickLook.Common.Plugin;
@@ -48,10 +49,10 @@ namespace QuickLook.Plugin.ImageViewer
private bool _isZoomFactorFirstSet = true;
private DateTime _lastZoomTime = DateTime.MinValue;
private double _maxZoomFactor = 3d;
private NConvert _meta;
private MetaProvider _meta;
private Visibility _metaIconVisibility = Visibility.Visible;
private double _minZoomFactor = 0.1d;
private BitmapScalingMode _renderMode = BitmapScalingMode.HighQuality;
private BitmapScalingMode _renderMode = BitmapScalingMode.NearestNeighbor;
private bool _showZoomLevelInfo = true;
private BitmapSource _source;
private double _zoomFactor = 1d;
@@ -87,14 +88,14 @@ namespace QuickLook.Plugin.ImageViewer
viewPanel.ManipulationDelta += ViewPanel_ManipulationDelta;
}
internal ImagePanel(ContextObject context, NConvert meta) : this()
internal ImagePanel(ContextObject context, MetaProvider meta) : this()
{
ContextObject = context;
Meta = meta;
var s = meta.GetSize();
_minZoomFactor = Math.Min(200d / s.Height, 400d / s.Width);
_maxZoomFactor = Math.Min(9000d / s.Height, 9000d / s.Width);
//_minZoomFactor = Math.Min(200d / s.Height, 400d / s.Width);
//_maxZoomFactor = Math.Min(9000d / s.Height, 9000d / s.Width);
ShowMeta();
Theme = ContextObject.Theme;
@@ -254,7 +255,7 @@ namespace QuickLook.Plugin.ImageViewer
}
}
public NConvert Meta
public MetaProvider Meta
{
get => _meta;
set
@@ -283,16 +284,11 @@ namespace QuickLook.Plugin.ImageViewer
private void ShowMeta()
{
textMeta.Inlines.Clear();
Meta.GetExif().ForEach(m =>
Meta.GetExif().Values.ForEach(m =>
{
if (string.IsNullOrWhiteSpace(m.Item1) || string.IsNullOrWhiteSpace(m.Item2))
return;
if (m.Item1 == "File name" || m.Item1 == "File size" || m.Item1 == "MIME type" ||
m.Item1 == "Exif comment"
|| m.Item1 == "Thumbnail" || m.Item1 == "Exif comment")
return;
textMeta.Inlines.Add(new Run(m.Item1) {FontWeight = FontWeights.SemiBold});
textMeta.Inlines.Add(": ");
textMeta.Inlines.Add(m.Item2);
@@ -304,7 +300,7 @@ namespace QuickLook.Plugin.ImageViewer
}
public event EventHandler<int> ImageScrolled;
public event EventHandler DelayedReRender;
public event EventHandler ZoomChanged;
private void ImagePanel_SizeChanged(object sender, SizeChangedEventArgs e)
{
@@ -488,10 +484,10 @@ namespace QuickLook.Plugin.ImageViewer
UpdateLayout();
if (!suppressEvent)
ProcessDelayed();
FireZoomChangedEvent();
}
private void ProcessDelayed()
private void FireZoomChangedEvent()
{
_lastZoomTime = DateTime.Now;
@@ -500,9 +496,9 @@ namespace QuickLook.Plugin.ImageViewer
if (DateTime.Now - _lastZoomTime < TimeSpan.FromSeconds(0.5))
return;
Debug.WriteLine($"ProcessDelayed fired: {Thread.CurrentThread.ManagedThreadId}");
Debug.WriteLine($"FireZoomChangedEvent fired: {Thread.CurrentThread.ManagedThreadId}");
Dispatcher.BeginInvoke(new Action(() => DelayedReRender?.Invoke(this, new EventArgs())),
Dispatcher.BeginInvoke(new Action(() => ZoomChanged?.Invoke(this, new EventArgs())),
DispatcherPriority.Background);
});
}

View File

@@ -0,0 +1,193 @@
// Copyright © 2020 Paddy Xu
//
// This file is part of QuickLook program.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows;
using System.Xml;
using ImageMagick;
namespace QuickLook.Plugin.ImageViewer
{
public class MetaProvider
{
private readonly SortedDictionary<string, (string, string)> _cache =
new SortedDictionary<string, (string, string)>(); // [key, [label, value]]
private readonly string _path;
public MetaProvider(string path)
{
_path = path;
GetExif();
}
public SortedDictionary<string, (string, string)> GetExif()
{
if (_cache.Count != 0)
return _cache;
var exif = NativeMethods.GetExif(_path);
if (string.IsNullOrEmpty(exif))
return _cache;
var xml = new XmlDocument();
xml.LoadXml(exif);
var iter = xml.SelectNodes("/Exif/child::node()")?.GetEnumerator();
while (iter != null && iter.MoveNext())
{
if (!(iter.Current is XmlNode node))
continue;
var key = node.Name;
var label = node.Attributes?["Label"]?.InnerText;
var value = node.InnerText;
_cache.Add(key, (label, value));
}
return _cache;
}
public byte[] GetThumbnail()
{
return NativeMethods.GetThumbnail(_path) ?? new byte[0];
}
public Size GetSize()
{
_cache.TryGetValue("_.Size.Width", out var w_);
_cache.TryGetValue("_.Size.Height", out var h_);
if (int.TryParse(w_.Item2, out var w) && int.TryParse(h_.Item2, out var h))
return new Size(w, h);
// fallback
using (var mi = new MagickImage())
{
mi.Ping(_path);
w = mi.Width;
h = mi.Height;
}
return w + h == 0 ? new Size(800, 600) : new Size(w, h);
}
public Orientation GetOrientation()
{
return (Orientation) NativeMethods.GetOrientation(_path);
}
}
internal static class NativeMethods
{
private static readonly bool Is64 = Environment.Is64BitProcess;
public static string GetExif(string file)
{
try
{
var len = Is64 ? GetExif_64(file, null) : GetExif_32(file, null);
if (len <= 0)
return string.Empty;
var sb = new StringBuilder(len + 1);
var _ = Is64 ? GetExif_64(file, sb) : GetExif_32(file, sb);
return sb.ToString();
}
catch (Exception e)
{
Debug.WriteLine(e);
return string.Empty;
}
}
public static byte[] GetThumbnail(string file)
{
try
{
var len = Is64 ? GetThumbnail_64(file, null) : GetThumbnail_32(file, null);
if (len <= 0)
return null;
var buffer = new byte[len];
var _ = Is64 ? GetThumbnail_64(file, buffer) : GetThumbnail_32(file, buffer);
return buffer;
}
catch (Exception e)
{
Debug.WriteLine(e);
return null;
}
}
public static int GetOrientation(string file)
{
try
{
return Is64 ? GetOrientation_64(file) : GetOrientation_32(file);
}
catch (Exception e)
{
Debug.WriteLine(e);
return 0;
}
}
[DllImport("exiv2-ql-32.dll", EntryPoint = "GetExif", CallingConvention = CallingConvention.Cdecl)]
private static extern int GetExif_32([MarshalAs(UnmanagedType.LPWStr)] string file,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder sb);
[DllImport("exiv2-ql-32.dll", EntryPoint = "GetThumbnail", CallingConvention = CallingConvention.Cdecl)]
private static extern int GetThumbnail_32([MarshalAs(UnmanagedType.LPWStr)] string file,
[MarshalAs(UnmanagedType.LPArray)] byte[] buffer);
[DllImport("exiv2-ql-32.dll", EntryPoint = "GetOrientation", CallingConvention = CallingConvention.Cdecl)]
private static extern int GetOrientation_32([MarshalAs(UnmanagedType.LPWStr)] string file);
[DllImport("exiv2-ql-64.dll", EntryPoint = "GetExif", CallingConvention = CallingConvention.Cdecl)]
private static extern int GetExif_64([MarshalAs(UnmanagedType.LPWStr)] string file,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder sb);
[DllImport("exiv2-ql-64.dll", EntryPoint = "GetThumbnail", CallingConvention = CallingConvention.Cdecl)]
private static extern int GetThumbnail_64([MarshalAs(UnmanagedType.LPWStr)] string file,
[MarshalAs(UnmanagedType.LPArray)] byte[] buffer);
[DllImport("exiv2-ql-64.dll", EntryPoint = "GetOrientation", CallingConvention = CallingConvention.Cdecl)]
private static extern int GetOrientation_64([MarshalAs(UnmanagedType.LPWStr)] string file);
}
public enum Orientation
{
Undefined = 0,
TopLeft = 1,
TopRight = 2,
BottomRight = 3,
BottomLeft = 4,
LeftTop = 5,
RightTop = 6,
RightBottom = 7,
LeftBottom = 8
}
}

View File

@@ -1,190 +0,0 @@
// Copyright © 2018 Paddy Xu
//
// This file is part of QuickLook program.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Windows;
namespace QuickLook.Plugin.ImageViewer
{
public enum Orientation
{
Undefined = 0,
TopLeft = 1,
TopRight = 2,
BottomRight = 3,
BottomLeft = 4,
LeftTop = 5,
RightTop = 6,
RightBottom = 7,
Leftbottom = 8
}
public class NConvert
{
private static readonly string NConvertPath =
Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "NConvert\\nconvert.exe");
private readonly List<Tuple<string, string>> _metaBasic = new List<Tuple<string, string>>();
private readonly List<Tuple<string, string>> _metaExif = new List<Tuple<string, string>>();
private readonly string _path;
public NConvert(string path)
{
_path = path;
GetMeta();
}
public List<Tuple<string, string>> GetExif()
{
return _metaExif;
}
public MemoryStream GetTiffStream(bool thumbnail)
{
var temp = Path.GetTempFileName();
File.Delete(temp);
var thumb = thumbnail ? "-embedded_jpeg" : "";
var d = RunInternal(
$"-quiet {thumb} -raw_camerabalance -raw_autobright -icc -out tiff -o \"{temp}\" \"{_path}\"",
10000);
var ms = new MemoryStream(File.ReadAllBytes(temp));
File.Delete(temp);
return ms;
}
public Size GetSize()
{
var ws = _metaBasic.Find(t => t.Item1 == "Width")?.Item2;
var hs = _metaBasic.Find(t => t.Item1 == "Height")?.Item2;
int.TryParse(ws, out var w);
int.TryParse(hs, out var h);
if (w == 0 || h == 0)
return Size.Empty;
switch (GetOrientation())
{
case Orientation.LeftTop:
case Orientation.RightTop:
case Orientation.RightBottom:
case Orientation.Leftbottom:
return new Size(h, w);
default:
return new Size(w, h);
}
}
public Orientation GetOrientation()
{
var o = _metaExif.Find(t => t.Item1 == "Orientation")?.Item2;
if (!string.IsNullOrEmpty(o)) return (Orientation) int.Parse(o.Substring(o.Length - 2, 1));
return Orientation.TopLeft;
}
private void GetMeta()
{
var lines = RunInternal($"-quiet -fullinfo \"{_path}\"")
.Replace("\r\n", "\n")
.Split('\n');
var crtDict = _metaBasic;
for (var i = 0; i < lines.Length; i++)
{
var segs = lines[i].Split(':');
if (segs.Length != 2)
continue;
var k = segs[0];
var v = segs[1];
if (k == "EXIF")
crtDict = _metaExif;
if (k.StartsWith(" "))
{
if (crtDict == _metaBasic) // trim all 4 spaces
{
if (!string.IsNullOrWhiteSpace(v))
crtDict.Add(new Tuple<string, string>(k.Trim(), v.Trim()));
}
else // in exif
{
if (!string.IsNullOrWhiteSpace(v))
{
var kk = k.Substring(0, k.Length - 8).Trim();
crtDict.Add(new Tuple<string, string>(kk, v.Trim())); // -8 to remove "(0xa001)"
}
}
}
else if (k.StartsWith(" "))
{
crtDict.Add(new Tuple<string, string>(k.Trim(), string.Empty));
}
}
}
private string RunInternal(string arg, int timeout = 2000)
{
try
{
string result;
using (var p = new Process())
{
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = NConvertPath;
p.StartInfo.Arguments = arg;
p.Start();
result = p.StandardOutput.ReadToEnd();
p.WaitForExit(timeout);
return result;
}
}
catch (Exception)
{
return string.Empty;
}
}
}
internal static class Extensions
{
public static byte[] ReadToEnd(this Stream stream)
{
using (var ms = new MemoryStream())
{
var buffer = new byte[8192];
int count;
while ((count = stream.Read(buffer, 0, buffer.Length)) > 0) ms.Write(buffer, 0, count);
return ms.ToArray();
}
}
}
}

View File

@@ -1,5 +0,0 @@
HEIF support based on https://github.com/liuziangexit/HEIF-Utility-Native-DLL
https://github.com/nokiatech/heif
Please check https://github.com/nokiatech/heif/blob/master/LICENSE.TXT

View File

@@ -1,508 +0,0 @@
------------------------------------------
NConvert v7.20
XnView v2.45
Copyright (c) 1991-2018 Pierre-E Gougelet
All Rights Reserved.
E-Mail: webmaster@xnview.com
WWW: http://www.xnview.com
------------------------------------------
Supported formats Extension Remarks
======================================================================================================
[max] 3DS Max thumbnail max
[bpr] AAA logo bpr
[ace] ACE texture ace
[adex] ADEX img rle
[aim] AIM Grey Scale ima im
[arf] ARF arf
[att] AT&T Group 4 att
[sst] AVHRR Image sst
[awd] AWD awd Windows only, Plugin required
[apx] Ability Photopaint Image apx
[acc] Access g4 acc
[aces] Aces200 ace
[acorn] Acorn Sprite acorn
[adt] AdTech perfectfax adt
[ai] Adobe Illustrator ai
[aphp] Adobe PhotoParade (images) php
[psd] Adobe Photoshop psd
[ocp] Advanced Art Studio ocp art pic
[anv] AirNav anv
[frm2] Album b<>b<EFBFBD> frm
[alias] Alias Image File pix als alias
[abmp] Alpha Microsystems BMP bmp
[2d] Amapi 2d
[ami] Amica Paint ami [b]
[iff] Amiga IFF iff blk
[info] Amiga icon info
[cpc] Amstrad Cpc Screen cpc
[atk] Andrew Toolkit raster object atk
[hdru] Apollo HDRU hdru hdr gn
[arcib] ArcInfo Binary hdr
[artdir] Art Director art
[art] Artisan art
[a64] Artist 64 a64
[arn] Astronomical Research Network arn
[pcp] Atari grafik pcp
[aurora] Aurora sim
[afx] Auto F/X afx
[dwg] AutoCAD DWG dwg Windows only, Third Party Plugin required (http://www.cadsofttools.com)
[dxf] AutoCAD DXF dxf Windows only, Third Party Plugin required (http://www.cadsofttools.com)
[cadc] Autocad CAD-Camera img
[fli] Autodesk Animator fli flc
[qcad] Autodesk QuickCAD thumbnail cad
[skf] Autodesk SKETCH thumbnail skf
[skp] Autodesk SketchUp component skp
[gm] Autologic gm gm2 gm4
[epa] Award Bios Logo epa
[ssp] Axialis Screensaver (images) ssp
[b3d] B3D (images) b3d
[bfli] BFLI bfl bfli fli flp afl
[bias] BIAS FringeProcessor msk img raw flt
[bmf] BMF bmf Windows only, Plugin required
[kap] BSB/KAP kap
[byusir] BYU SIR sir
[bmg] Bert's Coloring bmg ibg
[bfx] Bfx Bitware bfx
[biorad] Bio-Rad confocal pic
[pi] Blazing Paddles pi
[bob] Bob Raytracer bob
[bdr] Brender pix
[brk] Brooktrout 301 brk 301 brt
[uni] Brother Fax uni
[til] Buttonz & Tilez texture til
[cals] CALS Raster cal cals gp4 mil
[cdu] CDU Paint cdu
[cgm] CGM cgm Windows only, Third Party Plugin required (http://www.cadsofttools.com)
[dsi] CImage dsi
[cmu] CMU Window Manager cmu
[cp8] CP8 256 Gray Scale cp8
[crg] Calamus cpi crg
[cr2] Canon EOS-1D Mark II RAW cr2
[can] Canon Navigator Fax can
[crw] Canon PowerShot crw
[mbig] Cartes Michelin big
[cam] Casio QV-10/100 Camera cam
[cmt] Chinon ES-1000 digital camera cmt
[cip] Cisco IP Phone cip
[cloe] Cloe Ray-Tracer clo cloe
[rix] ColoRIX rix sci scx sc?
[wlm] CompW wlm Windows only, Plugin required
[gif] CompuServe GIF gif giff
[ce] Computer Eyes, Digital Vision ce
[ce1] ComputerEyes Raw ce1 ce2
[icd] Core IDC idc
[cdr] Corel Draw Bitmap (preview) cdr
[cpat] Corel Draw Pattern (preview) pat
[cbmf] Corel Flow (preview) bmf
[cmx] Corel Metafile Exchange (preview) cmx
[cpt] Corel PhotoPaint 6.0 cpt
[cncd] CoverDesigner (images) ncd
[cnct] CoverDesigner Template (images) nct
[cart] Crayola art
[dbw] DBW Render
[map] DIV Game Studio Map map
[fpg] DIV Game Studio Multi Map fpg
[dkb] DKB Ray-Tracer dis
[dpx] DPX dpx
[dali] Dali Raw sd0 sd1 sd2
[dcpy] Datacopy img
[degas] Degas & Degas Elite pi1 pc1 pi2 pc2 pi3 pc3 pi4 pi5 pi6
[lbm] Deluxe Paint, Electronic Arts lbm ilbm
[dicom] Dicom dcm acr dic dicom dc3
[tdim] Digital F/X tdim
[gem] Digital Research (GEM Paint) img gem
[dds] Direct Draw Surface dds
[dcmp] Discorp CMP Image cmp
[djvu] DjVu djvu djv iw4 Windows only, Plugin required
[dol] DolphinEd dol
[doodle] Doodle Atari doo
[dd] Doodle C64 dd
[jj] Doodle C64 (Compressed) jj
[cut] Dr Halo cut
[drz] Draz Paint drz
[fsh] EA Sports FSH fsh
[epi] EPS Interchange Format epi ept Ghostscript needed, available on http://www.cs.wisc.edu/~ghost/
[eri] ERI-chan (Entis Rasterized Image) eri Windows only, Plugin required
[esmp] ESM Software Pix pix
[ecc] Ecchi ecc
[tile] Eclipse tile
[c4] Edmics c4
[trup] Egg Paint trp
[eidi] Electric Image ei eidi
[bmc] Embroidery bmc
[eps] Encapsulated Postscript ps eps
[epsp] Encapsulated Postscript(Preview) eps
[esm] Enhance Simplex esm
[ecw] Enhanced Compressed Wavelet ecw Windows only, Plugin required
[eif] Eroiica eif
[efx] Everex Everfax efx ef3
[tdi] Explore (TDI) & Maya iff tdi
[fif] FIF (Iterated System) fif Windows only, Plugin required
[fit] FIT fit
[fpt] Face Painter fpt
[pwc] Fast Piecewise-constant pwc Windows only, Plugin required
[fax] Fax Group 3 g3 fax
[fmf] Fax man fmf
[fcx] Faxable PCX fcx
[ftf] Faxable TIFF ftf
[fmap] Fenix Map map
[ffpg] Fenix Multi Map fpg
[fmag] FileMagic mag
[fi] Flash Image fi
[ncy] FlashCam Frame ncy
[ncy] FlashCam frame ncy
[fpx] FlashPix Format fpx Windows only, Plugin required
[fits] Flexible Image Transport System fts fits fit
[bsg] Fontasy Grafik bsg
[f96] Fremont Fax96 f96
[fx3] Fugawi Map fx3
[raf] Fuji S2 RAW raf
[fp2] Fun Painter II fp2 fun
[fpr] Fun Photor fpr
[fbm] Fuzzy bitmap fbm cbm
[g16] GRS16 g16
[gmf] Gamma Fax gmf
[geo] GeoPaint geo
[gfaray] Gfa Raytrace sul
[gih] GigaPaint Hi-res gih
[gig] GigaPaint Multi gig
[xcf] Gimp Bitmap xcf
[gbr] Gimp Brush gbr
[gicon] Gimp Icon ico
[gpat] Gimp Pattern pat
[god] GoDot 4bt 4bit clp
[gun] GunPaint gun ifl
[hdri] HDRI hdr hdri
[hf] HF hf
[grob] HP-48/49 GROB gro grb
[of] HP-49 OpenFire gro2 gro4
[hpgl] HPGL-2 hp hpg hgl plt hpgl prn prt spl Windows only, Third Party Plugin required (http://www.cadsofttools.com)
[hru] HRU hru
[hsi] HSI Raw raw
[mdl] Half-Life Model mdl
[jtf] Hayes JTFax jtf
[hpi] Hemera Photo Image hpi
[hta] Hemera Thumbs hta
[m8] Heretic II MipMap m8
[hed] Hi-Eddi hed
[hir] Hires C64 hir hbm
[lif] Homeworld Texture lif
[kps] IBM Kips kps
[pseg] IBM Printer Page Segment pse
[im5] IM5 (Visilog) im5
[imt] IMNET Image imt
[ioca] IOCA ica ioca mod
[iss] ISS iss
[icl] Icon Library icl
[icb] Image Capture Board icb
[miff] Image Magick file mif miff
[ish] Image Speeder ish
[cish] Image System (Hires) ish
[cism] Image System (Multicolor) ism
[rlc2] Image Systems RLC2 Graphic rlc
[ilab] ImageLab b&w b_w
[g3n] Imaging Fax g3n
[imgt] Imaging Technology img
[img] Img Software Set img
[iim] Inshape iim
[ciph] InterPaint (Hires) iph
[cipt] InterPaint (Multicolor) ipt
[ingr] Intergraph Format itg cit rle
[iimg] Interleaf iimg
[ct] Iris CT ct
[iris] Iris Graphics iris
[wic] J Wavelet Image Codec wic Windows only, Plugin required
[jbig] JBIG jbg bie jbig Windows only, Plugin required
[jb2] JBIG-2 jb2 Windows only, Plugin required
[*] JFIF based file
[jpeg] JPEG / JFIF jpg jpeg jif jfif J jpe
[mjpg] JPEG 8BIM header (Mac) jpg jpeg jif jfif J jpe Windows only, Plugin required
[jpc] JPEG-2000 Code Stream jpc Windows only, Plugin required
[jp2] JPEG-2000 JP2 File Format jp2 j2k jpx jpf Windows only, Plugin required
[jls] JPEG-LS jls Windows only, Plugin required
[jif] Jeff's Image Format jif
[jig] Jigsaw jig
[vi] Jovian VI vi
[jng] Jpeg Network Graphics jng Windows only, Plugin required
[btn] JustButtons animated bitmap btn
[kntr] KONTRON img
[viff] Khoros Visualization Image file vif viff xv
[kskn] KinuPix Skin thb
[cel] Kiss Cel cel
[koa] Koala Paint koa
[gg] Koala Paint (Compressed) gg
[cin] Kodak Cineon cin
[kdc] Kodak DC120 Digital Camera kdc
[k25] Kodak DC25 Camera k25
[pcd] Kodak Photo CD pcd
[dcr] Kodak Pro Digital RAW dcr
[kfx] Kofax Group 4 kfx
[kqp] Konica Camera File kqp
[lss] LSS16 lss 16
[lvp] LView Pro lvp
[lda] LaserData lda
[lwi] Light Work Image lwi
[lff] LucasFilm Format lff
[lcel] Lumena CEL cel
[ldf] LuraDocument Format ldf Windows only, Plugin required
[ldfjpm] LuraDocument.jpm Format jpm Windows only, Plugin required
[lwf] LuraWave Format lwf Windows only, Plugin required
[lwfjpc] LuraWave JPEG-2000 Code Stream jpc Windows only, Plugin required
[lwfjp2] LuraWave JPEG-2000 Format jp2 j2k jpx jpf Windows only, Plugin required
[mag] MAKIchan Graphics mag
[pzp] MGI Photosuite Project (images) pzp
[mgr] MGR bitmap mgr
[mtv] MTV Ray-Tracer mtv
[mac] Mac Paint mac mpnt macp pntg pnt paint
[icns] Mac icon icns
[pict] Macintosh Quickdraw/Pict pic pict pict2 pct
[fff] Maggi Hairstyles & Cosmetics fff
[pd] Male MRI pd t1 t2
[fre] Male Normal CT fre
[mrf] Marks Russel File mrf
[411] Mavica 411
[mtx] Maw-Ware Textures mtx
[pdx] Mayura Draw pdx
[bld] MegaPaint bld
[mfrm] Megalux Frame frm
[pbt] Micro Dynamics MARS pbt
[mil] Micro Illustrator Uncompressed mil
[pp4] Micrografx Picture Publisher 4.0 pp4
[pp5] Micrografx Picture Publisher 5.0 pp5
[mic] Microsoft Image Composer mic
[msp] Microsoft Paint msp
[eyes] Microtek Eyestar img
[ipg] Mindjongg Format ipg
[mrw] Minolta DiMAGE RAW mrw
[mkcf] MonkeyCard pdb
[mklg] MonkeyLogo pdb
[mph] MonkeyPhoto mph
[sid] MrSid sid Windows only, Plugin required
[msx2] Msx 2 Screen sc2
[mng] Multiple Network Graphics mng
[mng2] Multiple Network Graphics mng
[ncr] NCR Image ncr
[nist] NIST ihdr pct
[nitf] National Imagery Transmission F. nitf
[car] NeoBook Cartoon car
[neo] Neochrome (ST & TT) neo
[npm] Neopaint Mask npm
[stw] Neopaint Stamp stw
[nsr] NewsRoom nsr ph bn
[nef] Nikon RAW nef mos
[ngg] Nokia Group Graphics ngg
[nlm] Nokia Logo File nlm
[otb] Nokia OTA bitmap otb
[nol] Nokia Operator Logo nol
[oaz] OAZ Fax oaz xfx
[os2] OS/2 Bitmap bmp bga
[ofx] Olicom Fax ofx
[orf] Olympus RAW orf
[oil] Open Image Library Format oil
[exr] OpenEXR exr
[cft] Optigraphics ctf
[ttf] Optigraphics Tiled ttf
[abs] Optocat abs
[ohir] Oric Hires hir
[otap] Oric TAP tap
[bga] Os/2 Warp bga
[pabx] PABX background pix
[pax] PAX pax
[pic] PC Paint / Pictor Page pic clp
[b16] PCO b16
[pm] PM pm
[pcl] Page Control Language pcl
[pmg] Paint Magic pmg
[jbf] PaintShopPro Browser Cache File jbf
[pspb] PaintShopPro Brush pspbrush
[pspf] PaintShopPro Frame pfr pspframe
[psp] PaintShopPro Image psp pspimage
[pspm] PaintShopPro Mask pspmask
[pmsk] PaintShopPro Mask msk
[pspp] PaintShopPro Pattern pat
[tub] PaintShopPro Picture Tube tub psptube
[pspt] PaintShopPro Texture tex
[palm] Palm Pilot pdb
[srf] Panasonic DMC-LC1 RAW srf
[pegs] Pegs pxs pxa
[pef] Pentax *ist D pef
[pfs] Pfs Art Publisher art
[pdd] Photo Deluxe pdd pdb
[fsy] PhotoFantasy Image fsy
[frm] PhotoFrame frm
[psf] PhotoStudio File psf
[stm] PhotoStudio Stamp stm
[cat] Photomatrix cat
[p2] Pic2 p2 Windows only, Plugin required
[p64] Picasso 64 p64
[prc] Picture Gear Pocket prc
[mix] Picture It! mix
[pxr] Pixar picture file pic pxr picio pixar
[pixp] Pixel Power Collage ib7 i17 i18 if9
[pxa] Pixia pxa
[pixi] Pixibox pxb
[pds] Planetary Data System pds img
[bms] Playback Bitmap Sequence bms
[2bp] Pocket PC Bitmap 2bp
[tsk] Pocket PC Themes (images) tsk
[prf] Polychrome Recursive Format prf
[pbm] Portable Bitmap pbm rpbm ppma
[pdf] Portable Document Format pdf Ghostscript needed, available on http://www.cs.wisc.edu/~ghost/
[pgm] Portable Greyscale pgm rpgm
[pnm] Portable Image pnm rpnm pbm rpbm pgm rpgm ppm rppm
[png] Portable Network Graphics png
[ppm] Portable Pixmap ppm rppm
[pgf] Portfolio Graphics pgf
[pgc] Portfolio Graphics Compressed pgc
[cvp] Portrait cvp
[bum] Poser Bump bum
[ps] Postscript ps ps1 ps2 ps3 eps prn Ghostscript needed, available on http://www.cs.wisc.edu/~ghost/
[crd] PowerCard maker crd
[pps] PowerPoint (images) pps
[ppt] PowerPoint Presentation (images) ppt
[pm] Print Master pm
[psa] Print Shop psa psb
[prx] Printfox/Pagefox bs pg gb
[cpa] Prism cpa
[prisms] Prisms pri
[psion3] Psion Series 3 Bitmap pic
[psion5] Psion Series 5 Bitmap mbm
[ppp] Punk Productions Picture ppp
[pzl] Puzzle pzl
[q0] Q0 q0 rgb
[qdv] Qdv (Random Dot Software) qdv
[qrt] Qrt Ray-Tracer qrt
[wal] Quake Texture wal
[vpb] Quantel VPB vpb
[qtif] QuickTime Image Format qtif qti
[ript] RIPTerm Image icn
[rad] Radiance rad img pic
[rp] Rainbow Painter rp
[raw] Raw raw gry grey
[ray] Rayshade pic
[rsb] Red Storm File Format rsb
[j6i] Ricoh Digital Camera j6i
[rfax] Ricoh Fax 001 ric
[pig] Ricoh IS30 pig
[xyz] Rm2K XYZ xyz
[rpm] RunPaint (Multicolor) rpm
[st4] SBIG CCD camera ST-4 st4
[stx] SBIG CCD camera ST-X stx st4 st5 st6 st7 st8
[spot] SPOT dat
[svg] SVG svg Windows only, Third Party Plugin required (http://www.cadsofttools.com)
[sar] Saracen Paint sar
[sci] SciFax sci
[sct] SciTex Continuous Tone sct ct ch
[sfw] Seattle Film Works sfw
[pwp] Seattle Film Works multi-image pwp sfw
[xp0] SecretPhotos puzzle xp0
[sj1] Sega SJ-1 DIGIO sj1
[gpb] Sharp GPB img
[bmx] Siemens Mobile bmx
[x3f] Sigma RAW x3f
[sgi] Silicon Graphics RGB rgb rgba bw iris sgi
[skn] Skantek skn
[hrz] Slow Scan Television hrz
[sdt] SmartDraw 6 template sdt
[sfax] SmartFax 001
[pan] SmoothMove Pan Viewer pan
[soft] Softimage pic si
[sir] Solitaire Image Recorder sir
[pmp] Sony DSC-F1 Cyber-shot pmp
[srf2] Sony DSC-F828 RAW srf
[tim2] Sony PS2 TIM tm2
[tim] Sony Playstation TIM tim
[spu] Spectrum 512 spu
[spc] Spectrum 512 (Compressed) spc
[sps] Spectrum 512 (Smooshed) sps
[ssi] SriSun ssi
[stad] Stad pic pac seq
[sdg] Star Office Gallery sdg
[star] Starbase img
[avs] Stardent AVS X x avs mbfs mbfavs
[aip] Starlight Xpress SX 500x291 RAW
[jps] Stereo Image jps
[sff] Structured Fax Format sff Windows only, Plugin required
[icon] Sun Icon/Cursor icon cursor ico pr
[ras] Sun Rasterfile ras rast sun sr scr rs
[taac] Sun TAAC file iff vff suniff taac
[syj] Syberia texture syj
[synu] Synthetic Universe syn synu
[tg4] TG4 tg4
[ti] TI Bitmap 92i 73i 82i 83i 85i 86i 89i
[tiff] TIFF Revision 6 tif tim tiff
[imi] TMSat image imi
[hr] TRS 80 hr
[teal] TealPaint pdb
[mh] Teli Fax mh
[tnl] Thumbnail tnl
[tjp] TilePic tjp
[tiny] Tiny tny tn1 tn2 tn3
[d3d] TopDesign Thumbnail b3d b2d
[gaf] Total Annihilation gaf
[tga] Truevision Targa tga targa pix bpx ivb
[upst] Ulead Pattern pst
[upi] Ulead PhotoImpact upi
[upe4] Ulead Texture (images) pe4
[face] Usenix FaceServer fac face
[rle] Utah raster image rle urt
[v] VIPS Image v
[vit] VITec vit
[wrl] VRML2 wrl
[vfx] Venta Fax vfx
[vif] Verity vif
[vicar] Vicar vic vicar img
[vid] Vidcom 64 vid
[vda] Video Display Adapter vda
[vista] Vista vst
[vivid] Vivid Ray-Tracer img
[vort] Vort pix
[vob] Vue d'esprit vob
[wad] WAD (Half life) wad
[iwc] WaveL iwc Windows only, Plugin required
[rla] Wavefront Raster file rla rlb rpf
[wbc] WebShots (images) wb1 wbc wbp wbz
[jig2] Weekly Puzzle jig
[ypc] Whypic ypc Windows only, Plugin required
[fxs] WinFAX fxs fxo wfx fxr fxd fxm
[winm] WinMIPS pic
[wmf] Windows & Aldus Metafile wmf Windows only
[ani] Windows Animated Cursor ani
[bmp] Windows Bitmap bmp rle vga rl4 rl8 sys
[clp] Windows Clipboard clp
[cur] Windows Cursor cur
[dib] Windows DIB dib
[emf] Windows Enhanced Metafile emf Windows only
[ico] Windows Icon ico
[wzl] Winzle Puzzle wzl
[wbmp] Wireless Bitmap (level 0) wbmp wbm wap
[wpg] Word Perfect Graphics (images) wpg
[wfx] Worldport Fax wfx
[xwd] X Windows System dump xwd x11
[xbm] X11 Bitmap xbm bm
[xpm] X11 Pixmap xpm pm
[p7] XV Visual Schnauzer p7
[xar] Xara (images) xar
[xif] Xerox DIFF xif
[xim] Ximage xim
[smp] Xionics SMP smp
[uyvy] YUV 16Bits yuv qtl uyvy
[uyvyi] YUV 16Bits Interleaved yuv qtl uyvy
[yuv411] YUV 4:1:1 yuv qtl
[yuv422] YUV 4:2:2 yuv qtl
[yuv444] YUV 4:4:4 yuv qtl
[zxhob] ZX Spectrum Hobetta $s $c !s
[zxsna] ZX Spectrum Snapshot sna
[zxscr] ZX Spectrum standard screen scr
[zzrough] ZZ Rough rgh
[dta] Zeiss BIVAS dta
[zmf] Zoner Callisto Metafile (preview) zmf
[zbr] Zoner Zebra Metafile (preview) zbr
[dcx] Zsoft Multi-page Paintbrush dcx
[pcx] Zsoft Publisher's Paintbrush pcx pcc dcx
[bif] byLight bif

View File

@@ -1,191 +0,0 @@
------------------------------------------
NConvert v7.20
XnView v2.46
Copyright (c) 1991-2018 Pierre-E Gougelet
All Rights Reserved.
E-Mail: webmaster@xnview.com
WWW: http://www.xnview.com
------------------------------------------
All Plugins must be in a directory called "Plugins" in the XnView directory !
Informations about XnView Plugins (windows only) :
==================================================
* http://www.xnview.com/download/plugins/heif_x32.zip
: Allows to read HEIC files
* Xawd.dll : Allows to read AWD files
* Xbmf.dll + BMF_read.dll : Allows to read BMF files.
* Xdjvu.dll : Allows to read to read AT&Ts DjVu format.
* Xecw.dll + NCScnet.dll + NCSEcw.dll + NCSEcwC.dll + NCSUtil.dll : Allows
to read ermapper format.
* Xeri.dll : Allows to read ERIchan format.
* Xfif.dll + deco_32.dll : Allows to read Iterated Systems format.
* Xfpx.dll : Allows to read/write FlashPix files.
* Xjbig.dll : Allows to read/write "Joint Bi-level Image experts Group" format.
* Xsff.dll : Allows to read Structured Fax files.
* Xwic.dll : Allows to read/write J Wavelet Image Codec format.
* lwf.dll : Allows to read/write Lurawave format.
Can only save images up to 4096x4096 pixels.
* ldf.dll : Allows to read LuraDocument format.
Can only save images up to 4096x4096 pixels and maximum of 6 pages.
* lwf_jp2.dll : Allows to read/write JPEG-2000 JP2/JPC File Format
Can only save images up to 4096x4096 pixels.
* Xiwc.dll : Allows to read/write WaveL format.
* Xjp2.dll : Allows to read/write JPEG-2000 JP2 File Format
& JPEG-2000 Code Stream.
* XMrSid.dll : Allows to read MrSid format.
* Xwlm.dll : Allows to read/write CompW format.
* Xjng.dll + libmng.dll : Allows to read JNG/MNG format.
* Xjpegls.dll : Allows to read JPEG lossless format.
* Xsusie.dll : Allows to use Susie's plugins.
* Xpwc.dll : Allows to read PWC (Fast Piecewise-constant) format.
* Xwhypic.dll : Allows to read YPC format.
* Xp2.dll : Allows to read Pic2 format.
* ncc.dll : Allows to show nCC (net.CynerCards) information from JPG, GIF
& PNG files. http://www.netcybercards.com
* mpeg.ll : Allows to extract frame from MPEG1 files
* pcdlib32.dll : Allows to read high resolution of PCD files
* dc120.dll : Allows to read kdc format.
* cpa.dll : Allows to read CPA Prism format.
* Xbsb.dll : Allows to read BSB/KAP format.
* ldf_jpm.dll : Allows to read/write LDF.jpm format.
* CS_DXF.dll + CS_DWG.dll + CS_HPGL.dll + CS_CGM.dll + CS_SVG.dll : Allows to read DXF/DWG/HPGL/CGM/SVG format (shareware)
Use third party component from www.cadsofttools.com
* Xcompound.dll : Allows to read 3DSMax & Picture IT! thumbnail, and Microsoft Image Composer.
* Xpax.dll : Allows to read PAX format
* rwz_sdk.dll : Allows to rawzor compressed files
* Xwsq.dll : Allows to read WSQ files (Wavelet Scaler Quantization)
* VTFLib.dll : Allows to read VTF format
* webp.dll : Allows to read/write WebP format
* paintnetlib.dll : Allows to read Paint.net format, Thanks to Johann ELSASS
* Xora.dll : Allows to read OpenRaster files
* bpg.exe : Allows to read BPG format - http://bellard.org/bpg/
* libflif.dll : Allows to read FLIF format - http://flif.info/
* clip.dll : Allows to read Clip Studio
About LuraWave, LuraDocument, LuraWave.jp2 & LuraDocument.jpm format:
--------------------------------------------------------------------
All images compressed with XnView LuraWave PlugIn should only be used for private
or evaluation purposes. Any other corporate or commercial use needs to licenced by LuraTech GmbH.
By compressing an image using the XnView LuraWave PlugIn, you accept this license agreement.
LuraTech Homepage : http://www.luratech.com
JBIG reading/writing:
--------------------
You need to purchase a license because JBIG is a patented format.
More information is available on http://www.ibm.com and http://www.jpeg.org/
Copyright:
---------
ECW Compression - http://www.ermapper.com/
(c) Earth Resource Mapping Ltd
DjVu - http://www.djvu.att.com/open
(c) AT&T Corp
- http://www.lizardtech.com/
Copyright (c) 1999, LizardTech, Inc
J Wavelet Image Codec based on work of Sasha Chukov
BMF Dmitry Shkarin (C) 1999
CompW - http://www.paralelo.com.br
Copyright (C) 1998, Paralelo Computa<74><61>o Ltda.
JasPer - http://www.ece.ubc.ca/~mdadams/jasper/
Copyright (c) 1999-2000, Image Power, Inc. and the University of British
Columbia, Canada.
Copyright (c) 2001 Michael David Adams.
IWC - http://www.wavelsoftware.com
Copyright 2001 WaveL Software
LIBMNG - http://www.libmng.com
Copyright (c) 2000,2001 Gerard Juyn
net.CyberCards - http://www.netcybercards.com
(c) Isomeris
PWC -
Copyright Paul Ausbeck
Whypic -
Copyright (c) Osamu YAMAJI
MrSid - http://www.lizardtech.com/
Copyright (c) 1999, LizardTech, Inc
DjVu - http://www.lizardtech.com/
Copyright (c) 1999, LizardTech, Inc
PCDlib32.dll -
DC120.dll
(c) Eastman Kodak Company
cpa.dll -
(c) Prism
CS_DXF.dll + CS_DWG.dll + CS_HPGL.dll + CS_CGM.dll + CS_SVG.dll - http://www.cadsofttools.com
(c) Soft Gold
PAX -
(C) 1999 Smaller Animals Software
Rawzor - http://www.rawzor.com/
(c) Sachin Garg

View File

@@ -1,145 +0,0 @@
Nconvert v7.20
XnView v2.46
Copyright (c) 1991-2018 Pierre-E Gougelet
All Rights Reserved.
Disclaimer
==========
Installing and using these software (Nview, Nconvert, View2, XnView) signifies acceptance of these terms and conditions of the license.
XnView/NConvert are provided as Freeware for private non-commercial or educational use, including non-profit organization (i.e. schools, universities, public authorities, police, fire brigade, and hospitals).
For commercial use and distribution, it is necessary to register. It is a help for the development of future versions.
You are granted the right to use and to make an unlimited number of copies of this software.
These software are provided "as-is".
No warranty of any kind is expressed or implied.
The author will not be liable for data loss, damages, loss of profits or any other kind of loss while using or misusing this software.
Any suggestions, feedback and comments are welcome.
Homepage
========
E-Mail: webmaster@xnview.com
contact@xnview.com
Web site : http://www.xnview.com
http://www.xnview.net
http://www.xnview.org
NewsGroup : http://newsgroup.xnview.com
Platforms
=========
ATARI ST, STe, Falcon, TT and compatible
PC x86 DOS
PC x86 Windows 3.1x, 95, 98, NT, Me, 2000, Xp, Vista, 7, 8.1, 10
PC x86 Linux v2.x (X Window & Lesstif/openMotif)
PC x86 FreeBSD v3.x (X Window & Lesstif/openMotif)
Silicon Graphics IRIX v5.2 and above
Sun Solaris v2.5.1 and above
Solaris x86 v8.0
HP-UX v11.0 and above
AIX v4.2 and above
BeOS v5.0 and above
MacOS X
GIF/TIFF LZW reading/writing:
-------------------
You need to purchase a license because LZW is a patented algorithm.
More information is available on http://www.unisys.com
JBIG reading/writing:
-------------------
You need to purchase a license because JBIG is a patented format.
More information is available on http://www.ibm.com and http://www.jpeg.org/
Copyright:
---------
Default toolbar mezich - http://mezich.livejournal.com
Icons are only for xnview
LibJPEG 6b - http://www.ijg.org
This software is copyright (C) 1991-1998, Thomas G. Lane. All Rights Reserved
PNGLib 1.2.5 - http://www.libpng.org/pub/png/
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. (libpng versions 0.5, May 1995, through 0.89c, May 1996)
Copyright (c) 1996, 1997 Andreas Dilger (libpng versions 0.90, December 1996, through 0.96, May 1997)
Copyright (c) 1998, 1999 Glenn Randers-Pehrson (libpng versions 0.97,January 1998, through 1.0.5, October 15, 1999)
Zlib 1.2.1 - http://www.gzip.org/zlib/
Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
JIF - http://jeff.cafe.net/jif/
(c) Jeff Tupper
RAW - http://www.cybercom.net/~dcoffin/dcraw/
(c) Dave Coffin
Credits:
--------
Solaris version : Tobias Oetiker
HP-UX version : Philippe Choquert
AIX version : Philippe Choquert
Translation:
------------
Afrikaans : Samuel Murray
Arabic : Mohammad Deeb
Basque : Axier Lopez
Bulgarian : Denis Ivajlov
Byelorussian : Alexander Gorbylev
Catalan : Jes<65>s Corrius
Chinese simplified : Alexander Yang, Roy Yao
Chinese traditional : Frank Liu, Alexander Yang
Croatian : Josip Sinkovic
Czech : Petr Bohdan
Danish : Allan Bergmann Jensen
Dutch : Michiel Oosterhagen, Theo Eering
Estonian : Ahti Kaskpeit
Finish : Haukur Krist<73>fer Bragason, Jouni Paulus
Galician : Fernando Coello
German : Axel C. Burgbacher, Helmut Mueller
Greek : Symeon Charalabides
Hebrew : Eitan Gilboa
Hungarian : Jozsef Herczeg
Icelandic : Svanur P<>lsson
Italian : Armando R. La Mura, Alexandro F.Proietti
Japanese : Sato Kazuyuki, Adrian Ivana, Yong Wei, Motomatsu Nobuhiro
Korean : Kim Wooyoung
Latvian : Aldis Putelis, Aldis Priednieks
Lithuanian : Linas Grinius
Malaysian : Ooi Ghee Tiong
Norwegian : Lasse Drageset, Lillian Solum
Polish : Skiff, Lukasz Jakubowski, Sergiusz Klimkiewicz, Tomasz Fiszer
Portuguese : Ant<6E>nio Eduardo Marques
Portuguese (Brazilian) : Paulo Neto
Romanian : Ioan Russu
Russian : Alexander Gorbylev, Igor Alikin
Serbian : Nik Vukovljak
Slovak : Peter Cipov, Lucas Sivak
Slovene : Filip Komar, Grega Fajdiga
Spanish : Jorge A. Montes P<>rez
Swedish : Olof T<>rnqvist, M<>rten Mellberg
Tha<68> : Thanachai Wachiraworakam
Turkish : Ibrahim Kutluay
Ukrainian : Taras Domansky
Uzbek : Sherzod Mamatkulov
Vietnamese : Ton, Quang Toai & Vo, Khanh Kim Van
Welsh : Geraint Jones

View File

@@ -1,188 +0,0 @@
NConvert v7.20
XnView v2.46
Copyright (c) 1991-2018 Pierre-E Gougelet
All Rights Reserved.
NVIEW
=====
Nview is a multi-format image viewer.
Type nview -help for available options.
About Nview for PC under DOS:
-----------------------------
Nview is VESA compatible and works in 8,15,16 bits and truecolor mode.
The only mode available is 320x200x8 if your video card doesn't
support Vesa mode.
For a complete description of the available modes on the display, type
nview -help (and use it with -d option's)
For example with my Diamond S3 864, "nview -d3 back.gif" use the 640x480x15 display.
With the -p<width>x<height>x<bits>, you take the best display that matches the arguments.
(Example: nview -p640x480x24 back.gif)
-p0x0x0 choose the best display for the bitmap.
About Nview for X Window:
--------------------------------------
Nview displays bitmaps on the default visual. You can use
-visual id (id is the visual number seeing with nview -help).
By default, Nview display the bitmap and wait for a mouse click or the Escape key.
With the -w option, Nview create one window per bitmap.
Nview works with pipe, in this case the input format must be specified:
cat img.tga | nview -f2 stdin
NCONVERT
========
Nconvert is the multi-format commandline image converter for Win32, DOS, OS/2, and other platforms.
Type "nconvert -help" for available options.
Type "nconvert -help > nchelp.txt" to save the help text into the file "nchelp.txt".
To convert files to a specific format, type for example :
nconvert -out 5 file1.pic file2.jpg file3.tga
or
nconvert -out tiff file1.pic file2.jpg file3.tga
With a resize :
nconvert -out jpeg -ratio -resize 480 0 *.jpg
nconvert -out jpeg -resize 640 480 *.jpg
The input format is not necessary, it will be autodetected. If a problem occurs, use the -in option.
Nconvert is able to transform images while converting:
* To convert GIF files to JPEG files :
nconvert -out jpeg -truecolors *.gif
* To convert JPEG files to GIF files :
nconvert -out gif -dither -colors 256 *.jpeg
* To resize :
nconvert -out png -resize 510 230 *.jpeg
nconvert -out png -ratio -resize 510 0 *.jpeg
nconvert -out png -ratio -resize 0 510 *.jpeg
nconvert -out png -resize 200% 200% *.jpeg
You can use it with images sequences.
For example, to convert the files file00.pic, file01.pic, ..., file10.pic and
we convert to jpeg format with the name pattern res0.jpg, res1.jpg, ... type :
nconvert -out jpeg -n 1 10 1 -o res#.jpg file##.pic
You can use % to specify source filename in dest filename.
For example, nconvert -out jpeg -o result_%.jpg file.tga
creates a file named result_file.jpg
Note for windows users: in batch files you must write %% instead of %. To bypass this problem, you can use a nconvert script instead of a batch file.
You can control nconvert with a script, performing multiple sets of conversions on multiple sets of files, example:
### -out png -rtype lanczos -resize 200% 150%
screenshot1.bmp
screenshot2.bmp
screenshot3.bmp
### -out gif -rtype lanczos -resize 500% 500% -oil 10 -colours 32
F:\icons\smile.bmp
### -out bmp -rtype lanczos -resize 30% 30% -oil 2 -rotate_flag smooth -rotate 45
selfportrait.png
mydog.png
Save this into a text file, for example "nc.txt", and then run nconvert with this file as the only parameter: "nconvert nc.txt" .
Limitations:
Add text feature uses the Win32 API and is avaiable on Win32 only.
Some exotical image formats use external DLL's and are available on Win32 only.
When using a script file, avoid multiple spaces in the conversion definitions, they confuse the parser.
Converting huge images, or scaling up to a huge size requires much memory and may not always work.
Notes for DOS users:
Since v4.90, nconvert is supported for DOS again. Is is a 32-bit DOS application, using the "DOS/32A Extender".
Also the NVIEW picture viewer had a DOS version, but was discontinued in 2002 at version 3.87. It is available bundled with old nconvert 3.87.
XnView (Extended Nview)
=======================
About XnView for X Window:
---------------------------
XnView requires OSF/Motif 1.2 or later.
Type xnview -help for available options.
XnView displays bitmaps on the default visual. You can specify
an X visual id (in hexadecimal) with '-visualid id'.
Linux/FreeBSD/OpenBSD Version:
-----------------------------
XnView requires Linux 2.0.x, XFree86-3.2 and Lesstif v0.91 or openMotif v2.1.30
openMotif is available from the following URL's :
ftp://openmotif.opengroup.org/pub/openmotif/R2.1.30/binaries/metrolink/
Lesstif is available from the following URL's
http://www.lesstif.org/products/lesstif/
ftp://ftp.lesstif.org/pub/hungry/lesstif/bindist
About XnView for Windows (x86):
-------------------------------
XnView for windows requires Windows 3.x with Win32s, or Windows 95/98/Me/NT/2000.
Windows 3.1x users note:
-----------------------
You'll need the latest release of win32s for Microsoft Windows 3.1x
and Windows for Workgroup 3.1x.
If there is a file called 'win32s.ini' in the directory \windows\system,
you already have win32s. This file contains the version information.
If the version number is equal or greater than 1.30.172 (v1.30c),
you don't have to reinstall win32s.
Win32s v1.30c can be downloaded via
ftp://ftp.rmc.edu/pub/windows16/win32s13.exe
About Unix version:
------------------
You will need to set the
* LD_LIBRARY_PATH (Irix, Linux, FreeBSD)
* SHLIB_PATH (HP-UX)
* LIBPATH (AIX)
* LIBRARY_PATH (BeOS)
environment variable with the path where the libraries are.
By default 'install' puts the libraries in /usr/local/lib.

View File

@@ -1,22 +0,0 @@
Please read the following terms and conditions before using this software. Use of this software indicates you accept the terms of this license agreement and warranty.
1. Disclaimer of warranty
XnView (or NConvert, XnView Shell Extension) is provided "as-is" and without warranty of any kind, express, implied or otherwise, including without limitation, any warranty of merchantability or fitness for a particular purpose.
In no event shall the author of this software be held liable for data loss, damages, loss of profits or any other kind of loss while using or misusing this software.
The software must not be modified, you may not decompile, disassemble.
2. License
XnView (or NConvert) is provided as freeware for private (non commercial), or educational use, including non-profit organization (i.e. schools, universities, public authorities, police, fire brigade, and hospitals).
In this case, you are granted the right to use and to make an unlimited number of copies of this software.
Company must purchase licenses to be able to use XnView (or NConvert).
XnView Shell Extension is provided as freeware
Copyright (C) 1997-2018 Pierre-e Gougelet. All rights reserved.

View File

@@ -35,13 +35,13 @@ namespace QuickLook.Plugin.ImageViewer
".iiq", ".k25", ".kdc", ".mdc", ".mef", ".mos", ".mrw", ".nef", ".nrw", ".obm", ".orf", ".pef", ".ptx",
".pxn", ".r3d", ".raf", ".raw", ".rwl", ".rw2", ".rwz", ".sr2", ".srf", ".srw", ".x3f",
// normal
".bmp",".heic", ".heif", ".ico", ".icon", ".jpg", ".jpeg", ".psd", ".wdp", ".tif", ".tiff", ".tga", ".webp", ".pbm",
".pgm", ".ppm", ".pnm",
".bmp", ".heic", ".heif", ".ico", ".icon", ".jpg", ".jpeg", ".psd", ".wdp", ".tif", ".tiff", ".tga",
".webp", ".pbm", ".pgm", ".ppm", ".pnm", ".svg",
// animated
".png", ".apng", ".gif"
};
private ImagePanel _ip;
private NConvert _meta;
private MetaProvider _meta;
public int Priority => 0;
@@ -58,7 +58,7 @@ namespace QuickLook.Plugin.ImageViewer
typeof(NativeImageProvider)));
AnimatedImage.AnimatedImage.Providers.Add(
new KeyValuePair<string[], Type>(new[] {"*"},
typeof(NConvertImageProvider)));
typeof(ImageMagickProvider)));
}
public bool CanHandle(string path)
@@ -68,7 +68,7 @@ namespace QuickLook.Plugin.ImageViewer
public void Prepare(string path, ContextObject context)
{
_meta = new NConvert(path);
_meta = new MetaProvider(path);
var size = _meta.GetSize();

View File

@@ -62,12 +62,19 @@
<Reference Include="LibAPNG">
<HintPath>.\LibAPNG.dll</HintPath>
</Reference>
<Reference Include="Magick.NET-Q8-AnyCPU, Version=7.16.1.0, Culture=neutral, PublicKeyToken=2004825badfa91ec, processorArchitecture=MSIL">
<HintPath>..\..\packages\Magick.NET-Q8-AnyCPU.7.16.1\lib\net40\Magick.NET-Q8-AnyCPU.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Xaml" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
@@ -78,12 +85,13 @@
<Compile Include="AnimatedImage\APngAnimationProvider.cs" />
<Compile Include="AnimatedImage\GifAnimationProvider.cs" />
<Compile Include="AnimatedImage\AnimationProvider.cs" />
<Compile Include="AnimatedImage\NConvertImageProvider.cs" />
<Compile Include="Helper.cs" />
<Compile Include="AnimatedImage\ImageMagickProvider.cs" />
<Compile Include="AnimatedImage\NativeImageProvider.cs" />
<Compile Include="ImagePanel.xaml.cs">
<DependentUpon>ImagePanel.xaml</DependentUpon>
</Compile>
<Compile Include="NConvert.cs" />
<Compile Include="MetaProvider.cs" />
<Compile Include="Plugin.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
@@ -105,58 +113,13 @@
<Resource Include="Resources\background.png" />
</ItemGroup>
<ItemGroup>
<Content Include="NConvert\docs\Formats.txt">
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Content Include="exiv2-ql-32.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\docs\license.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\docs\Plugins.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\docs\ReadMe.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\docs\Usage.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\docs\WhatsNew.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\nconvert.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\heif.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\heif.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\libwebp.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\msvcp120.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\msvcr120.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\opencv_core330.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\opencv_ffmpeg330.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\opencv_imgcodecs330.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\opencv_imgproc330.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\Plugins\opencv_videoio330.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="NConvert\vcomp120.dll">
<Content Include="exiv2-ql-64.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Magick.NET-Q8-AnyCPU" version="7.16.1" targetFramework="net462" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net462" />
</packages>

View File

@@ -51,7 +51,7 @@ namespace QuickLook.Plugin.PDFViewer
listThumbnails.SelectionChanged += UpdatePageViewWhenSelectionChanged;
pagePanel.DelayedReRender += ReRenderCurrentPageDelayed;
pagePanel.ZoomChanged += ReRenderCurrentPageDelayed;
pagePanel.ImageScrolled += NavigatePage;
}
@@ -80,7 +80,7 @@ namespace QuickLook.Plugin.PDFViewer
if (pagePanel != null)
{
pagePanel.DelayedReRender -= ReRenderCurrentPageDelayed;
pagePanel.ZoomChanged -= ReRenderCurrentPageDelayed;
pagePanel.ImageScrolled -= NavigatePage;
}

View File

@@ -44,6 +44,7 @@ along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.&#xD;
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpRenamePlacementToArrangementMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>