mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-10-31 18:47:18 -04: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