mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-03 19:17:24 -05:00 
			
		
		
		
	support photo orientation
This commit is contained in:
		
							parent
							
								
									02ad552792
								
							
						
					
					
						commit
						ed49e93118
					
				@ -89,7 +89,7 @@ namespace Emby.Drawing.GDI
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void EncodeImage(string inputPath, string cacheFilePath, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
 | 
			
		||||
        public void EncodeImage(string inputPath, string cacheFilePath, int rotationAngle, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
 | 
			
		||||
        {
 | 
			
		||||
            var hasPostProcessing = !string.IsNullOrEmpty(options.BackgroundColor) || options.UnplayedCount.HasValue || options.AddPlayedIndicator || options.PercentPlayed > 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -27,12 +27,13 @@ namespace Emby.Drawing
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="inputPath">The input path.</param>
 | 
			
		||||
        /// <param name="outputPath">The output path.</param>
 | 
			
		||||
        /// <param name="rotationAngle">The rotation angle.</param>
 | 
			
		||||
        /// <param name="width">The width.</param>
 | 
			
		||||
        /// <param name="height">The height.</param>
 | 
			
		||||
        /// <param name="quality">The quality.</param>
 | 
			
		||||
        /// <param name="options">The options.</param>
 | 
			
		||||
        /// <param name="outputFormat">The output format.</param>
 | 
			
		||||
        void EncodeImage(string inputPath, string outputPath, int width, int height, int quality, ImageProcessingOptions options, ImageFormat outputFormat);
 | 
			
		||||
        void EncodeImage(string inputPath, string outputPath, int rotationAngle, int width, int height, int quality, ImageProcessingOptions options, ImageFormat outputFormat);
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Creates the image collage.
 | 
			
		||||
 | 
			
		||||
@ -139,7 +139,7 @@ namespace Emby.Drawing.ImageMagick
 | 
			
		||||
                string.Equals(ext, ".webp", StringComparison.OrdinalIgnoreCase);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void EncodeImage(string inputPath, string outputPath, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
 | 
			
		||||
        public void EncodeImage(string inputPath, string outputPath, int rotationAngle, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
 | 
			
		||||
        {
 | 
			
		||||
            // Even if the caller specified 100, don't use it because it takes forever
 | 
			
		||||
            quality = Math.Min(quality, 99);
 | 
			
		||||
@ -150,6 +150,11 @@ namespace Emby.Drawing.ImageMagick
 | 
			
		||||
                {
 | 
			
		||||
                    ScaleImage(originalImage, width, height);
 | 
			
		||||
 | 
			
		||||
                    if (rotationAngle > 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        RotateImage(originalImage, rotationAngle);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    DrawIndicator(originalImage, width, height, options);
 | 
			
		||||
 | 
			
		||||
                    originalImage.CurrentImage.CompressionQuality = quality;
 | 
			
		||||
@ -166,6 +171,11 @@ namespace Emby.Drawing.ImageMagick
 | 
			
		||||
                    {
 | 
			
		||||
                        ScaleImage(originalImage, width, height);
 | 
			
		||||
 | 
			
		||||
                        if (rotationAngle > 0)
 | 
			
		||||
                        {
 | 
			
		||||
                            RotateImage(originalImage, rotationAngle);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        wand.CurrentImage.CompositeImage(originalImage, CompositeOperator.OverCompositeOp, 0, 0);
 | 
			
		||||
                        DrawIndicator(wand, width, height, options);
 | 
			
		||||
 | 
			
		||||
@ -179,6 +189,14 @@ namespace Emby.Drawing.ImageMagick
 | 
			
		||||
            SaveDelay();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static void RotateImage(MagickWand wand, float angle)
 | 
			
		||||
        {
 | 
			
		||||
            using (var pixelWand = new PixelWand("none", 1))
 | 
			
		||||
            {
 | 
			
		||||
                wand.CurrentImage.RotateImage(pixelWand, angle);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ScaleImage(MagickWand wand, int width, int height)
 | 
			
		||||
        {
 | 
			
		||||
            var highQuality = false;
 | 
			
		||||
 | 
			
		||||
@ -257,7 +257,7 @@ namespace Emby.Drawing
 | 
			
		||||
 | 
			
		||||
                    imageProcessingLockTaken = true;
 | 
			
		||||
 | 
			
		||||
                    _imageEncoder.EncodeImage(originalImagePath, cacheFilePath, newWidth, newHeight, quality, options, outputFormat);
 | 
			
		||||
                    _imageEncoder.EncodeImage(originalImagePath, cacheFilePath, GetRotationAngle(options.Item), newWidth, newHeight, quality, options, outputFormat);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return new Tuple<string, string>(cacheFilePath, GetMimeType(outputFormat, cacheFilePath));
 | 
			
		||||
@ -281,6 +281,35 @@ namespace Emby.Drawing
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private int GetRotationAngle(IHasImages item)
 | 
			
		||||
        {
 | 
			
		||||
            var photo = item as Photo;
 | 
			
		||||
            if (photo != null && photo.Orientation.HasValue)
 | 
			
		||||
            {
 | 
			
		||||
                switch (photo.Orientation.Value)
 | 
			
		||||
                {
 | 
			
		||||
                    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;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private string GetMimeType(ImageFormat format, string path)
 | 
			
		||||
        {
 | 
			
		||||
            if (format == ImageFormat.Bmp)
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,7 @@ namespace Emby.Drawing
 | 
			
		||||
            throw new NotImplementedException();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void EncodeImage(string inputPath, string outputPath, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
 | 
			
		||||
        public void EncodeImage(string inputPath, string outputPath, int rotationAngle, int width, int height, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
 | 
			
		||||
        {
 | 
			
		||||
            throw new NotImplementedException();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -1783,11 +1783,31 @@ namespace MediaBrowser.Server.Implementations.Dto
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (size.Width > 0 && size.Height > 0)
 | 
			
		||||
            var width = size.Width;
 | 
			
		||||
            var height = size.Height;
 | 
			
		||||
 | 
			
		||||
            if (width == 0 || height == 0)
 | 
			
		||||
            {
 | 
			
		||||
                return size.Width / size.Height;
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
 | 
			
		||||
            var photo = item as Photo;
 | 
			
		||||
            if (photo != null && photo.Orientation.HasValue)
 | 
			
		||||
            {
 | 
			
		||||
                switch (photo.Orientation.Value)
 | 
			
		||||
                {
 | 
			
		||||
                    case ImageOrientation.LeftBottom:
 | 
			
		||||
                    case ImageOrientation.LeftTop:
 | 
			
		||||
                    case ImageOrientation.RightBottom:
 | 
			
		||||
                    case ImageOrientation.RightTop:
 | 
			
		||||
                        var temp = height;
 | 
			
		||||
                        height = width;
 | 
			
		||||
                        width = temp;
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return width / height;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user