mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-03 19:17:24 -05:00 
			
		
		
		
	use image magick for auto-orientation
This commit is contained in:
		
							parent
							
								
									ed49e93118
								
							
						
					
					
						commit
						de83adb38c
					
				@ -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>
 | 
				
			||||||
 | 
				
			|||||||
@ -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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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.
 | 
				
			||||||
 | 
				
			|||||||
@ -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))
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
 | 
				
			|||||||
@ -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();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -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>
 | 
				
			||||||
@ -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>
 | 
				
			||||||
 | 
				
			|||||||
@ -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" />
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user