support photo orientation
This commit is contained in:
parent
d678059d13
commit
faa9127a20
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -1786,11 +1786,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…
Reference in New Issue
Block a user