|
@@ -91,9 +91,6 @@ namespace Jellyfin.Drawing.Skia
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private static bool IsTransparent(SKColor color)
|
|
|
- => (color.Red == 255 && color.Green == 255 && color.Blue == 255) || color.Alpha == 0;
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// Convert a <see cref="ImageFormat"/> to a <see cref="SKEncodedImageFormat"/>.
|
|
|
/// </summary>
|
|
@@ -111,65 +108,6 @@ namespace Jellyfin.Drawing.Skia
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- private static bool IsTransparentRow(SKBitmap bmp, int row)
|
|
|
- {
|
|
|
- for (var i = 0; i < bmp.Width; ++i)
|
|
|
- {
|
|
|
- if (!IsTransparent(bmp.GetPixel(i, row)))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- private static bool IsTransparentColumn(SKBitmap bmp, int col)
|
|
|
- {
|
|
|
- for (var i = 0; i < bmp.Height; ++i)
|
|
|
- {
|
|
|
- if (!IsTransparent(bmp.GetPixel(col, i)))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- private SKBitmap CropWhiteSpace(SKBitmap bitmap)
|
|
|
- {
|
|
|
- var topmost = 0;
|
|
|
- while (topmost < bitmap.Height && IsTransparentRow(bitmap, topmost))
|
|
|
- {
|
|
|
- topmost++;
|
|
|
- }
|
|
|
-
|
|
|
- int bottommost = bitmap.Height;
|
|
|
- while (bottommost >= 0 && IsTransparentRow(bitmap, bottommost - 1))
|
|
|
- {
|
|
|
- bottommost--;
|
|
|
- }
|
|
|
-
|
|
|
- var leftmost = 0;
|
|
|
- while (leftmost < bitmap.Width && IsTransparentColumn(bitmap, leftmost))
|
|
|
- {
|
|
|
- leftmost++;
|
|
|
- }
|
|
|
-
|
|
|
- var rightmost = bitmap.Width;
|
|
|
- while (rightmost >= 0 && IsTransparentColumn(bitmap, rightmost - 1))
|
|
|
- {
|
|
|
- rightmost--;
|
|
|
- }
|
|
|
-
|
|
|
- var newRect = SKRectI.Create(leftmost, topmost, rightmost - leftmost, bottommost - topmost);
|
|
|
-
|
|
|
- using var image = SKImage.FromBitmap(bitmap);
|
|
|
- using var subset = image.Subset(newRect);
|
|
|
- return SKBitmap.FromImage(subset);
|
|
|
- }
|
|
|
-
|
|
|
/// <inheritdoc />
|
|
|
/// <exception cref="ArgumentNullException">The path is null.</exception>
|
|
|
/// <exception cref="FileNotFoundException">The path is not valid.</exception>
|
|
@@ -312,22 +250,11 @@ namespace Jellyfin.Drawing.Skia
|
|
|
return resultBitmap;
|
|
|
}
|
|
|
|
|
|
- private SKBitmap? GetBitmap(string path, bool cropWhitespace, bool forceAnalyzeBitmap, ImageOrientation? orientation, out SKEncodedOrigin origin)
|
|
|
- {
|
|
|
- if (cropWhitespace)
|
|
|
- {
|
|
|
- using var bitmap = Decode(path, forceAnalyzeBitmap, orientation, out origin);
|
|
|
- return bitmap == null ? null : CropWhiteSpace(bitmap);
|
|
|
- }
|
|
|
-
|
|
|
- return Decode(path, forceAnalyzeBitmap, orientation, out origin);
|
|
|
- }
|
|
|
-
|
|
|
- private SKBitmap? GetBitmap(string path, bool cropWhitespace, bool autoOrient, ImageOrientation? orientation)
|
|
|
+ private SKBitmap? GetBitmap(string path, bool autoOrient, ImageOrientation? orientation)
|
|
|
{
|
|
|
if (autoOrient)
|
|
|
{
|
|
|
- var bitmap = GetBitmap(path, cropWhitespace, true, orientation, out var origin);
|
|
|
+ var bitmap = Decode(path, true, orientation, out var origin);
|
|
|
|
|
|
if (bitmap != null && origin != SKEncodedOrigin.TopLeft)
|
|
|
{
|
|
@@ -340,7 +267,7 @@ namespace Jellyfin.Drawing.Skia
|
|
|
return bitmap;
|
|
|
}
|
|
|
|
|
|
- return GetBitmap(path, cropWhitespace, false, orientation, out _);
|
|
|
+ return Decode(path, false, orientation, out _);
|
|
|
}
|
|
|
|
|
|
private SKBitmap OrientImage(SKBitmap bitmap, SKEncodedOrigin origin)
|
|
@@ -466,7 +393,7 @@ namespace Jellyfin.Drawing.Skia
|
|
|
var blur = options.Blur ?? 0;
|
|
|
var hasIndicator = options.AddPlayedIndicator || options.UnplayedCount.HasValue || !options.PercentPlayed.Equals(0);
|
|
|
|
|
|
- using var bitmap = GetBitmap(inputPath, options.CropWhiteSpace, autoOrient, orientation);
|
|
|
+ using var bitmap = GetBitmap(inputPath, autoOrient, orientation);
|
|
|
if (bitmap == null)
|
|
|
{
|
|
|
throw new InvalidDataException($"Skia unable to read image {inputPath}");
|
|
@@ -474,9 +401,7 @@ namespace Jellyfin.Drawing.Skia
|
|
|
|
|
|
var originalImageSize = new ImageDimensions(bitmap.Width, bitmap.Height);
|
|
|
|
|
|
- if (!options.CropWhiteSpace
|
|
|
- && options.HasDefaultOptions(inputPath, originalImageSize)
|
|
|
- && !autoOrient)
|
|
|
+ if (options.HasDefaultOptions(inputPath, originalImageSize) && !autoOrient)
|
|
|
{
|
|
|
// Just spit out the original file if all the options are default
|
|
|
return inputPath;
|