use image magick for auto-orientation

This commit is contained in:
Luke Pulverenti 2016-01-21 11:53:03 -05:00
parent ed49e93118
commit de83adb38c
9 changed files with 37 additions and 35 deletions

View File

@ -37,7 +37,7 @@
</Reference> </Reference>
<Reference Include="ImageMagickSharp, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="ImageMagickSharp, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\ImageMagickSharp.1.0.0.17\lib\net45\ImageMagickSharp.dll</HintPath> <HintPath>..\packages\ImageMagickSharp.1.0.0.18\lib\net45\ImageMagickSharp.dll</HintPath>
</Reference> </Reference>
<Reference Include="Patterns.Logging"> <Reference Include="Patterns.Logging">
<HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath> <HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath>

View File

@ -89,7 +89,7 @@ namespace Emby.Drawing.GDI
} }
} }
public void EncodeImage(string inputPath, string cacheFilePath, int rotationAngle, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat) public void EncodeImage(string inputPath, string cacheFilePath, bool autoOrient, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{ {
var hasPostProcessing = !string.IsNullOrEmpty(options.BackgroundColor) || options.UnplayedCount.HasValue || options.AddPlayedIndicator || options.PercentPlayed > 0; var hasPostProcessing = !string.IsNullOrEmpty(options.BackgroundColor) || options.UnplayedCount.HasValue || options.AddPlayedIndicator || options.PercentPlayed > 0;

View File

@ -27,13 +27,13 @@ namespace Emby.Drawing
/// </summary> /// </summary>
/// <param name="inputPath">The input path.</param> /// <param name="inputPath">The input path.</param>
/// <param name="outputPath">The output path.</param> /// <param name="outputPath">The output path.</param>
/// <param name="rotationAngle">The rotation angle.</param> /// <param name="autoOrient">if set to <c>true</c> [automatic orient].</param>
/// <param name="width">The width.</param> /// <param name="width">The width.</param>
/// <param name="height">The height.</param> /// <param name="height">The height.</param>
/// <param name="quality">The quality.</param> /// <param name="quality">The quality.</param>
/// <param name="options">The options.</param> /// <param name="options">The options.</param>
/// <param name="outputFormat">The output format.</param> /// <param name="outputFormat">The output format.</param>
void EncodeImage(string inputPath, string outputPath, int rotationAngle, int width, int height, int quality, ImageProcessingOptions options, ImageFormat outputFormat); void EncodeImage(string inputPath, string outputPath, bool autoOrient, int width, int height, int quality, ImageProcessingOptions options, ImageFormat outputFormat);
/// <summary> /// <summary>
/// Creates the image collage. /// Creates the image collage.

View File

@ -139,7 +139,7 @@ namespace Emby.Drawing.ImageMagick
string.Equals(ext, ".webp", StringComparison.OrdinalIgnoreCase); string.Equals(ext, ".webp", StringComparison.OrdinalIgnoreCase);
} }
public void EncodeImage(string inputPath, string outputPath, int rotationAngle, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat) public void EncodeImage(string inputPath, string outputPath, bool autoOrient, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{ {
// Even if the caller specified 100, don't use it because it takes forever // Even if the caller specified 100, don't use it because it takes forever
quality = Math.Min(quality, 99); quality = Math.Min(quality, 99);
@ -150,9 +150,9 @@ namespace Emby.Drawing.ImageMagick
{ {
ScaleImage(originalImage, width, height); ScaleImage(originalImage, width, height);
if (rotationAngle > 0) if (autoOrient)
{ {
RotateImage(originalImage, rotationAngle); AutoOrientImage(originalImage);
} }
DrawIndicator(originalImage, width, height, options); DrawIndicator(originalImage, width, height, options);
@ -171,9 +171,9 @@ namespace Emby.Drawing.ImageMagick
{ {
ScaleImage(originalImage, width, height); ScaleImage(originalImage, width, height);
if (rotationAngle > 0) if (autoOrient)
{ {
RotateImage(originalImage, rotationAngle); AutoOrientImage(originalImage);
} }
wand.CurrentImage.CompositeImage(originalImage, CompositeOperator.OverCompositeOp, 0, 0); wand.CurrentImage.CompositeImage(originalImage, CompositeOperator.OverCompositeOp, 0, 0);
@ -189,6 +189,11 @@ namespace Emby.Drawing.ImageMagick
SaveDelay(); SaveDelay();
} }
private void AutoOrientImage(MagickWand wand)
{
wand.CurrentImage.AutoOrientImage();
}
public static void RotateImage(MagickWand wand, float angle) public static void RotateImage(MagickWand wand, float angle)
{ {
using (var pixelWand = new PixelWand("none", 1)) using (var pixelWand = new PixelWand("none", 1))

View File

@ -257,7 +257,7 @@ namespace Emby.Drawing
imageProcessingLockTaken = true; imageProcessingLockTaken = true;
_imageEncoder.EncodeImage(originalImagePath, cacheFilePath, GetRotationAngle(options.Item), newWidth, newHeight, quality, options, outputFormat); _imageEncoder.EncodeImage(originalImagePath, cacheFilePath, AutoOrient(options.Item), newWidth, newHeight, quality, options, outputFormat);
} }
return new Tuple<string, string>(cacheFilePath, GetMimeType(outputFormat, cacheFilePath)); return new Tuple<string, string>(cacheFilePath, GetMimeType(outputFormat, cacheFilePath));
@ -281,35 +281,32 @@ namespace Emby.Drawing
} }
} }
private int GetRotationAngle(IHasImages item) private bool AutoOrient(IHasImages item)
{ {
var photo = item as Photo; var photo = item as Photo;
if (photo != null && photo.Orientation.HasValue) if (photo != null && photo.Orientation.HasValue)
{ {
switch (photo.Orientation.Value) return true;
{
case ImageOrientation.TopLeft:
return 0;
case ImageOrientation.TopRight:
return 0;
case ImageOrientation.BottomLeft:
return 270;
case ImageOrientation.BottomRight:
return 180;
case ImageOrientation.LeftBottom:
return -90;
case ImageOrientation.LeftTop:
return 0;
case ImageOrientation.RightBottom:
return 0;
case ImageOrientation.RightTop:
return 90;
}
} }
return 0; return false;
} }
//private static int[][] OPERATIONS = new int[][] {
// TopLeft
//new int[] { 0, NONE},
// TopRight
//new int[] { 0, HORIZONTAL},
//new int[] {180, NONE},
// LeftTop
//new int[] { 0, VERTICAL},
//new int[] { 90, HORIZONTAL},
// RightTop
//new int[] { 90, NONE},
//new int[] {-90, HORIZONTAL},
//new int[] {-90, NONE},
//};
private string GetMimeType(ImageFormat format, string path) private string GetMimeType(ImageFormat format, string path)
{ {
if (format == ImageFormat.Bmp) if (format == ImageFormat.Bmp)

View File

@ -32,7 +32,7 @@ namespace Emby.Drawing
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void EncodeImage(string inputPath, string outputPath, int rotationAngle, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat) public void EncodeImage(string inputPath, string outputPath, bool autoOrient, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="CommonIO" version="1.0.0.7" targetFramework="net45" /> <package id="CommonIO" version="1.0.0.7" targetFramework="net45" />
<package id="ImageMagickSharp" version="1.0.0.17" targetFramework="net45" /> <package id="ImageMagickSharp" version="1.0.0.18" targetFramework="net45" />
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" /> <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
</packages> </packages>

View File

@ -67,7 +67,7 @@
</Reference> </Reference>
<Reference Include="ImageMagickSharp, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="ImageMagickSharp, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\ImageMagickSharp.1.0.0.17\lib\net45\ImageMagickSharp.dll</HintPath> <HintPath>..\packages\ImageMagickSharp.1.0.0.18\lib\net45\ImageMagickSharp.dll</HintPath>
</Reference> </Reference>
<Reference Include="MediaBrowser.IsoMounter"> <Reference Include="MediaBrowser.IsoMounter">
<HintPath>..\packages\MediaBrowser.IsoMounting.3.0.69\lib\net45\MediaBrowser.IsoMounter.dll</HintPath> <HintPath>..\packages\MediaBrowser.IsoMounting.3.0.69\lib\net45\MediaBrowser.IsoMounter.dll</HintPath>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="CommonIO" version="1.0.0.7" targetFramework="net45" /> <package id="CommonIO" version="1.0.0.7" targetFramework="net45" />
<package id="ImageMagickSharp" version="1.0.0.17" targetFramework="net45" /> <package id="ImageMagickSharp" version="1.0.0.18" targetFramework="net45" />
<package id="MediaBrowser.IsoMounting" version="3.0.69" targetFramework="net45" /> <package id="MediaBrowser.IsoMounting" version="3.0.69" targetFramework="net45" />
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" /> <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
<package id="System.Data.SQLite.Core" version="1.0.94.0" targetFramework="net45" /> <package id="System.Data.SQLite.Core" version="1.0.94.0" targetFramework="net45" />