mirror of
https://github.com/QL-Win/QuickLook.git
synced 2025-09-11 17:59:17 +00:00
using modified exiv2-ql (QL-Win/exiv2@cf560437bb) to detect Exif; switch from NConvert to Magick.NET
This commit is contained in:
@@ -37,7 +37,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
private int _lastEffectivePreviousPreviousFrameIndex;
|
private int _lastEffectivePreviousPreviousFrameIndex;
|
||||||
private NativeImageProvider _nativeImageProvider;
|
private NativeImageProvider _nativeImageProvider;
|
||||||
|
|
||||||
public APngAnimationProvider(string path, NConvert meta) : base(path, meta)
|
public APngAnimationProvider(string path, MetaProvider meta) : base(path, meta)
|
||||||
{
|
{
|
||||||
if (!IsAnimatedPng(path))
|
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)
|
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)
|
public override Task<BitmapSource> GetRenderedFrame(int index)
|
||||||
|
@@ -48,7 +48,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
public event EventHandler ImageLoaded;
|
public event EventHandler ImageLoaded;
|
||||||
public event EventHandler DoZoomToFit;
|
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 ext = Path.GetExtension(path.LocalPath).ToLower();
|
||||||
var type = Providers.First(p => p.Key.Contains(ext) || p.Key.Contains("*")).Value;
|
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));
|
new UIPropertyMetadata(null, AnimationUriChanged));
|
||||||
|
|
||||||
public static readonly DependencyProperty MetaProperty =
|
public static readonly DependencyProperty MetaProperty =
|
||||||
DependencyProperty.Register("Meta", typeof(NConvert), typeof(AnimatedImage));
|
DependencyProperty.Register("Meta", typeof(MetaProvider), typeof(AnimatedImage));
|
||||||
|
|
||||||
public static readonly DependencyProperty ContextObjectProperty =
|
public static readonly DependencyProperty ContextObjectProperty =
|
||||||
DependencyProperty.Register("ContextObject", typeof(ContextObject), typeof(AnimatedImage));
|
DependencyProperty.Register("ContextObject", typeof(ContextObject), typeof(AnimatedImage));
|
||||||
@@ -86,9 +86,9 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
set => SetValue(AnimationUriProperty, value);
|
set => SetValue(AnimationUriProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public NConvert Meta
|
public MetaProvider Meta
|
||||||
{
|
{
|
||||||
private get => (NConvert) GetValue(MetaProperty);
|
private get => (MetaProvider) GetValue(MetaProperty);
|
||||||
set => SetValue(MetaProperty, value);
|
set => SetValue(MetaProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,13 +106,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
//var thumbnail = instance.Meta?.GetThumbnail(true);
|
//var thumbnail = instance.Meta?.GetThumbnail(true);
|
||||||
//instance.Source = thumbnail;
|
//instance.Source = thumbnail;
|
||||||
|
|
||||||
instance._animation = LoadFullImageCore((Uri) ev.NewValue, instance.Meta);
|
instance._animation = InitAnimationProvider((Uri) ev.NewValue, instance.Meta);
|
||||||
ShowThumbnailAndStartAnimation(instance);
|
ShowThumbnailAndStartAnimation(instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ShowThumbnailAndStartAnimation(AnimatedImage 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;
|
if (task == null) return;
|
||||||
|
|
||||||
task.ContinueWith(_ => instance.Dispatcher.Invoke(() =>
|
task.ContinueWith(_ => instance.Dispatcher.Invoke(() =>
|
||||||
@@ -121,8 +121,12 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
instance.Source = _.Result;
|
instance.Source = _.Result;
|
||||||
|
|
||||||
|
if (_.Result != null)
|
||||||
|
{
|
||||||
instance.DoZoomToFit?.Invoke(instance, new EventArgs());
|
instance.DoZoomToFit?.Invoke(instance, new EventArgs());
|
||||||
instance.ImageLoaded?.Invoke(instance, new EventArgs());
|
instance.ImageLoaded?.Invoke(instance, new EventArgs());
|
||||||
|
}
|
||||||
|
|
||||||
instance.BeginAnimation(AnimationFrameIndexProperty, instance._animation?.Animator);
|
instance.BeginAnimation(AnimationFrameIndexProperty, instance._animation?.Animator);
|
||||||
}));
|
}));
|
||||||
@@ -141,8 +145,18 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
|
|
||||||
task.ContinueWith(_ => instance.Dispatcher.Invoke(() =>
|
task.ContinueWith(_ => instance.Dispatcher.Invoke(() =>
|
||||||
{
|
{
|
||||||
if (!instance._disposing)
|
if (instance._disposing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var firstLoad = instance.Source == null;
|
||||||
|
|
||||||
instance.Source = _.Result;
|
instance.Source = _.Result;
|
||||||
|
|
||||||
|
if (firstLoad)
|
||||||
|
{
|
||||||
|
instance.DoZoomToFit?.Invoke(instance, new EventArgs());
|
||||||
|
instance.ImageLoaded?.Invoke(instance, new EventArgs());
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
task.Start();
|
task.Start();
|
||||||
}
|
}
|
||||||
|
@@ -25,7 +25,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
{
|
{
|
||||||
internal abstract class AnimationProvider : IDisposable
|
internal abstract class AnimationProvider : IDisposable
|
||||||
{
|
{
|
||||||
protected AnimationProvider(string path, NConvert meta)
|
protected AnimationProvider(string path, MetaProvider meta)
|
||||||
{
|
{
|
||||||
Path = path;
|
Path = path;
|
||||||
Meta = meta;
|
Meta = meta;
|
||||||
@@ -33,13 +33,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
|
|
||||||
public string Path { get; }
|
public string Path { get; }
|
||||||
|
|
||||||
public NConvert Meta { get; }
|
public MetaProvider Meta { get; }
|
||||||
|
|
||||||
public Int32AnimationUsingKeyFrames Animator { get; protected set; }
|
public Int32AnimationUsingKeyFrames Animator { get; protected set; }
|
||||||
|
|
||||||
public abstract void Dispose();
|
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);
|
public abstract Task<BitmapSource> GetRenderedFrame(int index);
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,7 @@ using System.Threading.Tasks;
|
|||||||
using System.Windows.Media.Animation;
|
using System.Windows.Media.Animation;
|
||||||
using System.Windows.Media.Imaging;
|
using System.Windows.Media.Imaging;
|
||||||
using QuickLook.Common.ExtensionMethods;
|
using QuickLook.Common.ExtensionMethods;
|
||||||
|
using QuickLook.Common.Helpers;
|
||||||
using Size = System.Windows.Size;
|
using Size = System.Windows.Size;
|
||||||
|
|
||||||
namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
||||||
@@ -31,10 +32,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
private BitmapSource _frame;
|
private BitmapSource _frame;
|
||||||
private bool _isPlaying;
|
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 = (Bitmap) Image.FromFile(path);
|
||||||
|
|
||||||
|
_fileHandle.SetResolution(DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Horizontal,
|
||||||
|
DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Vertical);
|
||||||
|
|
||||||
Animator = new Int32AnimationUsingKeyFrames {RepeatBehavior = RepeatBehavior.Forever};
|
Animator = new Int32AnimationUsingKeyFrames {RepeatBehavior = RepeatBehavior.Forever};
|
||||||
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0))));
|
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0))));
|
||||||
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(10))));
|
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(10))));
|
||||||
@@ -53,7 +57,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
_frame = null;
|
_frame = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Task<BitmapSource> GetThumbnail(Size size, Size fullSize)
|
public override Task<BitmapSource> GetThumbnail(Size renderSize)
|
||||||
{
|
{
|
||||||
return new Task<BitmapSource>(() =>
|
return new Task<BitmapSource>(() =>
|
||||||
{
|
{
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright © 2018 Paddy Xu
|
// Copyright © 2020 Paddy Xu
|
||||||
//
|
//
|
||||||
// This file is part of QuickLook program.
|
// This file is part of QuickLook program.
|
||||||
//
|
//
|
||||||
@@ -16,49 +16,53 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using System.Windows.Media.Animation;
|
using System.Windows.Media.Animation;
|
||||||
using System.Windows.Media.Imaging;
|
using System.Windows.Media.Imaging;
|
||||||
|
using ImageMagick;
|
||||||
using QuickLook.Common.Helpers;
|
using QuickLook.Common.Helpers;
|
||||||
|
|
||||||
namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
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 = new Int32AnimationUsingKeyFrames();
|
||||||
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0,
|
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0,
|
||||||
KeyTime.FromTimeSpan(TimeSpan.Zero)));
|
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 *
|
var fullSize = Meta.GetSize();
|
||||||
Math.Min(size.Width / 2 / fullSize.Width,
|
|
||||||
size.Height / 2 / fullSize.Height));
|
|
||||||
var decodeHeight = (int) Math.Round(fullSize.Height / fullSize.Width * decodeWidth);
|
|
||||||
|
|
||||||
return new Task<BitmapSource>(() =>
|
return new Task<BitmapSource>(() =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var ms = Meta.GetTiffStream(true))
|
using (var buffer = new MemoryStream(Meta.GetThumbnail()))
|
||||||
{
|
{
|
||||||
|
if (buffer.Length == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
var img = new BitmapImage();
|
var img = new BitmapImage();
|
||||||
img.BeginInit();
|
img.BeginInit();
|
||||||
img.StreamSource = ms;
|
img.StreamSource = buffer;
|
||||||
img.CacheOption = BitmapCacheOption.OnLoad;
|
img.CacheOption = BitmapCacheOption.OnLoad;
|
||||||
img.DecodePixelWidth = decodeWidth;
|
//// specific renderSize to avoid .net's double to int conversion
|
||||||
img.DecodePixelHeight = decodeHeight; // specific size 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();
|
img.EndInit();
|
||||||
|
|
||||||
var scaled = new TransformedBitmap(img,
|
var scaled = new TransformedBitmap(img,
|
||||||
new ScaleTransform(fullSize.Width / img.PixelWidth, fullSize.Height / img.PixelHeight));
|
new ScaleTransform(fullSize.Width / img.PixelWidth, fullSize.Height / img.PixelHeight));
|
||||||
scaled.Freeze();
|
|
||||||
|
|
||||||
|
Helper.DpiHack(scaled);
|
||||||
|
scaled.Freeze();
|
||||||
return scaled;
|
return scaled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,17 +76,27 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
|
|
||||||
public override Task<BitmapSource> GetRenderedFrame(int index)
|
public override Task<BitmapSource> GetRenderedFrame(int index)
|
||||||
{
|
{
|
||||||
|
var fullSize = Meta.GetSize();
|
||||||
|
|
||||||
return new Task<BitmapSource>(() =>
|
return new Task<BitmapSource>(() =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var ms = Meta.GetTiffStream(false))
|
using (var mi = new MagickImage(Path))
|
||||||
{
|
{
|
||||||
var img = new BitmapImage();
|
var profile = mi.GetColorProfile();
|
||||||
img.BeginInit();
|
if (profile?.Description != null && !profile.Description.Contains("sRGB"))
|
||||||
img.StreamSource = ms;
|
mi.SetProfile(ColorProfile.SRGB);
|
||||||
img.CacheOption = BitmapCacheOption.OnLoad;
|
|
||||||
img.EndInit();
|
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();
|
img.Freeze();
|
||||||
return img;
|
return img;
|
@@ -27,19 +27,25 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
{
|
{
|
||||||
internal class NativeImageProvider : AnimationProvider
|
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 = new Int32AnimationUsingKeyFrames();
|
||||||
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0,
|
Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(0,
|
||||||
KeyTime.FromTimeSpan(TimeSpan.Zero)));
|
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 *
|
var fullSize = Meta.GetSize();
|
||||||
Math.Min(size.Width / 2 / fullSize.Width,
|
|
||||||
size.Height / 2 / fullSize.Height));
|
//var decodeWidth = (int) Math.Round(fullSize.Width *
|
||||||
var decodeHeight = (int) Math.Round(fullSize.Height / fullSize.Width * decodeWidth);
|
// 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 orientation = Meta.GetOrientation();
|
||||||
var rotate = ShouldRotate(orientation);
|
var rotate = ShouldRotate(orientation);
|
||||||
|
|
||||||
@@ -51,18 +57,22 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
img.BeginInit();
|
img.BeginInit();
|
||||||
img.UriSource = new Uri(Path);
|
img.UriSource = new Uri(Path);
|
||||||
img.CacheOption = BitmapCacheOption.OnLoad;
|
img.CacheOption = BitmapCacheOption.OnLoad;
|
||||||
|
// specific renderSize to avoid .net's double to int conversion
|
||||||
img.DecodePixelWidth = rotate ? decodeHeight : decodeWidth;
|
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();
|
img.EndInit();
|
||||||
|
|
||||||
var scaled = rotate ?
|
var scaled = rotate
|
||||||
new TransformedBitmap(img,
|
? new TransformedBitmap(img,
|
||||||
new ScaleTransform(fullSize.Height / img.PixelWidth, fullSize.Width / img.PixelHeight))
|
new ScaleTransform(fullSize.Height / img.PixelWidth, fullSize.Width / img.PixelHeight))
|
||||||
: new TransformedBitmap(img,
|
: new TransformedBitmap(img,
|
||||||
new ScaleTransform(fullSize.Width / img.PixelWidth, fullSize.Height / img.PixelHeight));
|
new ScaleTransform(fullSize.Width / img.PixelWidth, fullSize.Height / img.PixelHeight));
|
||||||
|
|
||||||
var rotated = ApplyTransformFromExif(scaled, orientation);
|
var rotated = ApplyTransformFromExif(scaled, orientation);
|
||||||
|
|
||||||
|
Helper.DpiHack(rotated);
|
||||||
rotated.Freeze();
|
rotated.Freeze();
|
||||||
|
|
||||||
return rotated;
|
return rotated;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@@ -75,6 +85,9 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
|
|
||||||
public override Task<BitmapSource> GetRenderedFrame(int index)
|
public override Task<BitmapSource> GetRenderedFrame(int index)
|
||||||
{
|
{
|
||||||
|
var fullSize = Meta.GetSize();
|
||||||
|
var rotate = ShouldRotate(Meta.GetOrientation());
|
||||||
|
|
||||||
return new Task<BitmapSource>(() =>
|
return new Task<BitmapSource>(() =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -83,9 +96,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
img.BeginInit();
|
img.BeginInit();
|
||||||
img.UriSource = new Uri(Path);
|
img.UriSource = new Uri(Path);
|
||||||
img.CacheOption = BitmapCacheOption.OnLoad;
|
img.CacheOption = BitmapCacheOption.OnLoad;
|
||||||
|
img.DecodePixelWidth = (int) (rotate ? fullSize.Height : fullSize.Width);
|
||||||
|
img.DecodePixelHeight = (int) (rotate ? fullSize.Width : fullSize.Height);
|
||||||
img.EndInit();
|
img.EndInit();
|
||||||
|
|
||||||
var img2 = ApplyTransformFromExif(img, Meta.GetOrientation());
|
var img2 = ApplyTransformFromExif(img, Meta.GetOrientation());
|
||||||
|
|
||||||
|
Helper.DpiHack(img2);
|
||||||
img2.Freeze();
|
img2.Freeze();
|
||||||
|
|
||||||
return img2;
|
return img2;
|
||||||
@@ -100,13 +117,13 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
|
|
||||||
private static bool ShouldRotate(Orientation orientation)
|
private static bool ShouldRotate(Orientation orientation)
|
||||||
{
|
{
|
||||||
bool rotate = false;
|
var rotate = false;
|
||||||
switch (orientation)
|
switch (orientation)
|
||||||
{
|
{
|
||||||
case Orientation.LeftTop:
|
case Orientation.LeftTop:
|
||||||
case Orientation.RightTop:
|
case Orientation.RightTop:
|
||||||
case Orientation.RightBottom:
|
case Orientation.RightBottom:
|
||||||
case Orientation.Leftbottom:
|
case Orientation.LeftBottom:
|
||||||
rotate = true;
|
rotate = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -137,7 +154,7 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage
|
|||||||
return new TransformedBitmap(
|
return new TransformedBitmap(
|
||||||
new TransformedBitmap(image, new RotateTransform(270)),
|
new TransformedBitmap(image, new RotateTransform(270)),
|
||||||
new ScaleTransform(-1, 1, 0, 0));
|
new ScaleTransform(-1, 1, 0, 0));
|
||||||
case Orientation.Leftbottom:
|
case Orientation.LeftBottom:
|
||||||
return new TransformedBitmap(image, new RotateTransform(270));
|
return new TransformedBitmap(image, new RotateTransform(270));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
41
QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Helper.cs
Normal file
41
QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Helper.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -76,23 +76,37 @@
|
|||||||
</Border.Resources>
|
</Border.Resources>
|
||||||
</Border>
|
</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"
|
HorizontalAlignment="Right" VerticalAlignment="Top"
|
||||||
Visibility="{Binding ElementName=imagePanel, Path=MetaIconVisibility}"
|
Visibility="{Binding ElementName=imagePanel, Path=MetaIconVisibility}"
|
||||||
Margin="0,8,8,0" Content="" />
|
Margin="0,8,40,0" Content="" />
|
||||||
|
|
||||||
<Button x:Name="buttonBackgroundColour" Style="{StaticResource CaptionButtonStyle}" Width="24" Height="24"
|
<Button x:Name="buttonBackgroundColour" Style="{StaticResource CaptionButtonStyle}" Width="24" Height="24"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Top"
|
HorizontalAlignment="Right" VerticalAlignment="Top"
|
||||||
Visibility="{Binding ElementName=imagePanel, Path=BackgroundVisibility}"
|
Visibility="{Binding ElementName=imagePanel, Path=BackgroundVisibility}"
|
||||||
Margin="0,8,40,0" Content="" />
|
Margin="0,8,8,0" Content="" />
|
||||||
|
|
||||||
<TextBlock x:Name="textMeta" IsHitTestVisible="False" Visibility="Collapsed" HorizontalAlignment="Right"
|
<TextBlock x:Name="textMeta" IsHitTestVisible="False" HorizontalAlignment="Right"
|
||||||
VerticalAlignment="Top" FontSize="11"
|
VerticalAlignment="Top" FontSize="11"
|
||||||
Padding="5,5,5,5" Margin="0,40,8,0" Background="{DynamicResource CaptionBackground}"
|
Padding="5,5,5,5" Margin="0,40,8,0" Background="{DynamicResource CaptionBackground}"
|
||||||
Foreground="{DynamicResource WindowTextForeground}">
|
Foreground="{DynamicResource WindowTextForeground}">
|
||||||
<TextBlock.Inlines>
|
<TextBlock.Inlines>
|
||||||
<Run FontWeight="SemiBold">Camera maker</Run><Run>: </Run><Run>SONY</Run>
|
<Run FontWeight="SemiBold">Camera maker</Run>
|
||||||
|
<Run>: </Run>
|
||||||
|
<Run>SONY</Run>
|
||||||
</TextBlock.Inlines>
|
</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>
|
</TextBlock>
|
||||||
</Grid>
|
</Grid>
|
||||||
</UserControl>
|
</UserControl>
|
@@ -31,6 +31,7 @@ using System.Windows.Media.Animation;
|
|||||||
using System.Windows.Media.Imaging;
|
using System.Windows.Media.Imaging;
|
||||||
using System.Windows.Threading;
|
using System.Windows.Threading;
|
||||||
using QuickLook.Common.Annotations;
|
using QuickLook.Common.Annotations;
|
||||||
|
using QuickLook.Common.ExtensionMethods;
|
||||||
using QuickLook.Common.Helpers;
|
using QuickLook.Common.Helpers;
|
||||||
using QuickLook.Common.Plugin;
|
using QuickLook.Common.Plugin;
|
||||||
|
|
||||||
@@ -48,10 +49,10 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
private bool _isZoomFactorFirstSet = true;
|
private bool _isZoomFactorFirstSet = true;
|
||||||
private DateTime _lastZoomTime = DateTime.MinValue;
|
private DateTime _lastZoomTime = DateTime.MinValue;
|
||||||
private double _maxZoomFactor = 3d;
|
private double _maxZoomFactor = 3d;
|
||||||
private NConvert _meta;
|
private MetaProvider _meta;
|
||||||
private Visibility _metaIconVisibility = Visibility.Visible;
|
private Visibility _metaIconVisibility = Visibility.Visible;
|
||||||
private double _minZoomFactor = 0.1d;
|
private double _minZoomFactor = 0.1d;
|
||||||
private BitmapScalingMode _renderMode = BitmapScalingMode.HighQuality;
|
private BitmapScalingMode _renderMode = BitmapScalingMode.NearestNeighbor;
|
||||||
private bool _showZoomLevelInfo = true;
|
private bool _showZoomLevelInfo = true;
|
||||||
private BitmapSource _source;
|
private BitmapSource _source;
|
||||||
private double _zoomFactor = 1d;
|
private double _zoomFactor = 1d;
|
||||||
@@ -87,14 +88,14 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
viewPanel.ManipulationDelta += ViewPanel_ManipulationDelta;
|
viewPanel.ManipulationDelta += ViewPanel_ManipulationDelta;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal ImagePanel(ContextObject context, NConvert meta) : this()
|
internal ImagePanel(ContextObject context, MetaProvider meta) : this()
|
||||||
{
|
{
|
||||||
ContextObject = context;
|
ContextObject = context;
|
||||||
Meta = meta;
|
Meta = meta;
|
||||||
|
|
||||||
var s = meta.GetSize();
|
var s = meta.GetSize();
|
||||||
_minZoomFactor = Math.Min(200d / s.Height, 400d / s.Width);
|
//_minZoomFactor = Math.Min(200d / s.Height, 400d / s.Width);
|
||||||
_maxZoomFactor = Math.Min(9000d / s.Height, 9000d / s.Width);
|
//_maxZoomFactor = Math.Min(9000d / s.Height, 9000d / s.Width);
|
||||||
|
|
||||||
ShowMeta();
|
ShowMeta();
|
||||||
Theme = ContextObject.Theme;
|
Theme = ContextObject.Theme;
|
||||||
@@ -254,7 +255,7 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public NConvert Meta
|
public MetaProvider Meta
|
||||||
{
|
{
|
||||||
get => _meta;
|
get => _meta;
|
||||||
set
|
set
|
||||||
@@ -283,16 +284,11 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
private void ShowMeta()
|
private void ShowMeta()
|
||||||
{
|
{
|
||||||
textMeta.Inlines.Clear();
|
textMeta.Inlines.Clear();
|
||||||
Meta.GetExif().ForEach(m =>
|
Meta.GetExif().Values.ForEach(m =>
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(m.Item1) || string.IsNullOrWhiteSpace(m.Item2))
|
if (string.IsNullOrWhiteSpace(m.Item1) || string.IsNullOrWhiteSpace(m.Item2))
|
||||||
return;
|
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(new Run(m.Item1) {FontWeight = FontWeights.SemiBold});
|
||||||
textMeta.Inlines.Add(": ");
|
textMeta.Inlines.Add(": ");
|
||||||
textMeta.Inlines.Add(m.Item2);
|
textMeta.Inlines.Add(m.Item2);
|
||||||
@@ -304,7 +300,7 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler<int> ImageScrolled;
|
public event EventHandler<int> ImageScrolled;
|
||||||
public event EventHandler DelayedReRender;
|
public event EventHandler ZoomChanged;
|
||||||
|
|
||||||
private void ImagePanel_SizeChanged(object sender, SizeChangedEventArgs e)
|
private void ImagePanel_SizeChanged(object sender, SizeChangedEventArgs e)
|
||||||
{
|
{
|
||||||
@@ -488,10 +484,10 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
UpdateLayout();
|
UpdateLayout();
|
||||||
|
|
||||||
if (!suppressEvent)
|
if (!suppressEvent)
|
||||||
ProcessDelayed();
|
FireZoomChangedEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ProcessDelayed()
|
private void FireZoomChangedEvent()
|
||||||
{
|
{
|
||||||
_lastZoomTime = DateTime.Now;
|
_lastZoomTime = DateTime.Now;
|
||||||
|
|
||||||
@@ -500,9 +496,9 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
if (DateTime.Now - _lastZoomTime < TimeSpan.FromSeconds(0.5))
|
if (DateTime.Now - _lastZoomTime < TimeSpan.FromSeconds(0.5))
|
||||||
return;
|
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);
|
DispatcherPriority.Background);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
193
QuickLook.Plugin/QuickLook.Plugin.ImageViewer/MetaProvider.cs
Normal file
193
QuickLook.Plugin/QuickLook.Plugin.ImageViewer/MetaProvider.cs
Normal 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
|
||||||
|
}
|
||||||
|
}
|
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
@@ -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
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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
|
|
@@ -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
|
|
||||||
|
|
||||||
|
|
@@ -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
|
|
||||||
|
|
@@ -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.
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@@ -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.
|
|
Binary file not shown.
Binary file not shown.
@@ -35,13 +35,13 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
".iiq", ".k25", ".kdc", ".mdc", ".mef", ".mos", ".mrw", ".nef", ".nrw", ".obm", ".orf", ".pef", ".ptx",
|
".iiq", ".k25", ".kdc", ".mdc", ".mef", ".mos", ".mrw", ".nef", ".nrw", ".obm", ".orf", ".pef", ".ptx",
|
||||||
".pxn", ".r3d", ".raf", ".raw", ".rwl", ".rw2", ".rwz", ".sr2", ".srf", ".srw", ".x3f",
|
".pxn", ".r3d", ".raf", ".raw", ".rwl", ".rw2", ".rwz", ".sr2", ".srf", ".srw", ".x3f",
|
||||||
// normal
|
// normal
|
||||||
".bmp",".heic", ".heif", ".ico", ".icon", ".jpg", ".jpeg", ".psd", ".wdp", ".tif", ".tiff", ".tga", ".webp", ".pbm",
|
".bmp", ".heic", ".heif", ".ico", ".icon", ".jpg", ".jpeg", ".psd", ".wdp", ".tif", ".tiff", ".tga",
|
||||||
".pgm", ".ppm", ".pnm",
|
".webp", ".pbm", ".pgm", ".ppm", ".pnm", ".svg",
|
||||||
// animated
|
// animated
|
||||||
".png", ".apng", ".gif"
|
".png", ".apng", ".gif"
|
||||||
};
|
};
|
||||||
private ImagePanel _ip;
|
private ImagePanel _ip;
|
||||||
private NConvert _meta;
|
private MetaProvider _meta;
|
||||||
|
|
||||||
public int Priority => 0;
|
public int Priority => 0;
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
typeof(NativeImageProvider)));
|
typeof(NativeImageProvider)));
|
||||||
AnimatedImage.AnimatedImage.Providers.Add(
|
AnimatedImage.AnimatedImage.Providers.Add(
|
||||||
new KeyValuePair<string[], Type>(new[] {"*"},
|
new KeyValuePair<string[], Type>(new[] {"*"},
|
||||||
typeof(NConvertImageProvider)));
|
typeof(ImageMagickProvider)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CanHandle(string path)
|
public bool CanHandle(string path)
|
||||||
@@ -68,7 +68,7 @@ namespace QuickLook.Plugin.ImageViewer
|
|||||||
|
|
||||||
public void Prepare(string path, ContextObject context)
|
public void Prepare(string path, ContextObject context)
|
||||||
{
|
{
|
||||||
_meta = new NConvert(path);
|
_meta = new MetaProvider(path);
|
||||||
|
|
||||||
var size = _meta.GetSize();
|
var size = _meta.GetSize();
|
||||||
|
|
||||||
|
@@ -62,12 +62,19 @@
|
|||||||
<Reference Include="LibAPNG">
|
<Reference Include="LibAPNG">
|
||||||
<HintPath>.\LibAPNG.dll</HintPath>
|
<HintPath>.\LibAPNG.dll</HintPath>
|
||||||
</Reference>
|
</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="PresentationCore" />
|
||||||
<Reference Include="PresentationFramework" />
|
<Reference Include="PresentationFramework" />
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Drawing" />
|
<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.Xaml" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
<Reference Include="WindowsBase" />
|
<Reference Include="WindowsBase" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -78,12 +85,13 @@
|
|||||||
<Compile Include="AnimatedImage\APngAnimationProvider.cs" />
|
<Compile Include="AnimatedImage\APngAnimationProvider.cs" />
|
||||||
<Compile Include="AnimatedImage\GifAnimationProvider.cs" />
|
<Compile Include="AnimatedImage\GifAnimationProvider.cs" />
|
||||||
<Compile Include="AnimatedImage\AnimationProvider.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="AnimatedImage\NativeImageProvider.cs" />
|
||||||
<Compile Include="ImagePanel.xaml.cs">
|
<Compile Include="ImagePanel.xaml.cs">
|
||||||
<DependentUpon>ImagePanel.xaml</DependentUpon>
|
<DependentUpon>ImagePanel.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="NConvert.cs" />
|
<Compile Include="MetaProvider.cs" />
|
||||||
<Compile Include="Plugin.cs" />
|
<Compile Include="Plugin.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -105,58 +113,13 @@
|
|||||||
<Resource Include="Resources\background.png" />
|
<Resource Include="Resources\background.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="NConvert\docs\Formats.txt">
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="exiv2-ql-32.dll">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="NConvert\docs\license.txt">
|
<Content Include="exiv2-ql-64.dll">
|
||||||
<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">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
BIN
QuickLook.Plugin/QuickLook.Plugin.ImageViewer/exiv2-ql-32.dll
Normal file
BIN
QuickLook.Plugin/QuickLook.Plugin.ImageViewer/exiv2-ql-32.dll
Normal file
Binary file not shown.
BIN
QuickLook.Plugin/QuickLook.Plugin.ImageViewer/exiv2-ql-64.dll
Normal file
BIN
QuickLook.Plugin/QuickLook.Plugin.ImageViewer/exiv2-ql-64.dll
Normal file
Binary file not shown.
@@ -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>
|
@@ -51,7 +51,7 @@ namespace QuickLook.Plugin.PDFViewer
|
|||||||
|
|
||||||
listThumbnails.SelectionChanged += UpdatePageViewWhenSelectionChanged;
|
listThumbnails.SelectionChanged += UpdatePageViewWhenSelectionChanged;
|
||||||
|
|
||||||
pagePanel.DelayedReRender += ReRenderCurrentPageDelayed;
|
pagePanel.ZoomChanged += ReRenderCurrentPageDelayed;
|
||||||
pagePanel.ImageScrolled += NavigatePage;
|
pagePanel.ImageScrolled += NavigatePage;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ namespace QuickLook.Plugin.PDFViewer
|
|||||||
|
|
||||||
if (pagePanel != null)
|
if (pagePanel != null)
|
||||||
{
|
{
|
||||||
pagePanel.DelayedReRender -= ReRenderCurrentPageDelayed;
|
pagePanel.ZoomChanged -= ReRenderCurrentPageDelayed;
|
||||||
pagePanel.ImageScrolled -= NavigatePage;
|
pagePanel.ImageScrolled -= NavigatePage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -44,6 +44,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
<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_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_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_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_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_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
Reference in New Issue
Block a user