Browse Source

Move logic of computing Blurhash components to ImageProcessor

Also rename last few instances of GetImageHash to GetImageBlurHash for clarity
Vasily 5 years ago
parent
commit
26eef1bbf8

+ 18 - 1
Emby.Drawing/ImageProcessor.cs

@@ -315,7 +315,24 @@ namespace Emby.Drawing
 
         /// <inheritdoc />
         public string GetImageBlurHash(string path)
-            => _imageEncoder.GetImageHash(path);
+        {
+            var size = GetImageDimensions(path);
+            if (size.Width <= 0 || size.Height <= 0)
+            {
+                return string.Empty;
+            }
+
+            // We want tiles to be as close to square as possible, and to *mostly* keep under 16 tiles for performance.
+            // One tile is (width / xComp) x (height / yComp) pixels, which means that ideally yComp = xComp * height / width.
+            // See more at https://github.com/woltapp/blurhash/#how-do-i-pick-the-number-of-x-and-y-components
+            float xCompF = MathF.Sqrt(16.0f * size.Width / size.Height);
+            float yCompF = xCompF * size.Height / size.Width;
+
+            int xComp = Math.Min((int)xCompF + 1, 9);
+            int yComp = Math.Min((int)yCompF + 1, 9);
+
+            return _imageEncoder.GetImageBlurHash(xComp, yComp, path);
+        }
 
         /// <inheritdoc />
         public string GetImageCacheTag(BaseItem item, ItemImageInfo image)

+ 1 - 1
Emby.Drawing/NullImageEncoder.cs

@@ -44,7 +44,7 @@ namespace Emby.Drawing
         }
 
         /// <inheritdoc />
-        public string GetImageHash(string path)
+        public string GetImageBlurHash(int xComp, int yComp, string path)
         {
             throw new NotImplementedException();
         }

+ 1 - 0
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -1882,6 +1882,7 @@ namespace Emby.Server.Implementations.Library
                 ImageDimensions size = _imageProcessor.GetImageDimensions(item, image);
                 image.Width = size.Width;
                 image.Height = size.Height;
+
                 try
                 {
                     image.BlurHash = _imageProcessor.GetImageBlurHash(image.Path);

+ 1 - 17
Jellyfin.Drawing.Skia/SkiaEncoder.cs

@@ -234,29 +234,13 @@ namespace Jellyfin.Drawing.Skia
         /// <exception cref="ArgumentNullException">The path is null.</exception>
         /// <exception cref="FileNotFoundException">The path is not valid.</exception>
         /// <exception cref="SkiaCodecException">The file at the specified path could not be used to generate a codec.</exception>
-        public string GetImageHash(string path)
+        public string GetImageBlurHash(int xComp, int yComp, string path)
         {
             if (path == null)
             {
                 throw new ArgumentNullException(nameof(path));
             }
 
-            var dims = GetImageSize(path);
-            if (dims.Width <= 0 || dims.Height <= 0)
-            {
-                // empty image does not have any blurhash
-                return string.Empty;
-            }
-
-            // We want tiles to be as close to square as possible, and to *mostly* keep under 16 tiles for performance.
-            // One tile is (width / xComp) x (height / yComp) pixels, which means that ideally yComp = xComp * height / width.
-            // See more at https://github.com/woltapp/blurhash/#how-do-i-pick-the-number-of-x-and-y-components
-            float xCompF = MathF.Sqrt(16.0f * dims.Width / dims.Height);
-            float yCompF = xCompF * dims.Height / dims.Width;
-
-            int xComp = Math.Min((int)xCompF + 1, 9);
-            int yComp = Math.Min((int)yCompF + 1, 9);
-
             return BlurHashEncoder.Encode(xComp, yComp, path);
         }
 

+ 3 - 1
MediaBrowser.Controller/Drawing/IImageEncoder.cs

@@ -46,9 +46,11 @@ namespace MediaBrowser.Controller.Drawing
         /// <summary>
         /// Gets the blurhash of an image.
         /// </summary>
+        /// <param name="xComp">Amount of X components of DCT to take.</param>
+        /// <param name="yComp">Amount of Y components of DCT to take.</param>
         /// <param name="path">The filepath of the image.</param>
         /// <returns>The blurhash.</returns>
-        string GetImageHash(string path);
+        string GetImageBlurHash(int xComp, int yComp, string path);
 
         /// <summary>
         /// Encode an image.