/// <summary> /// Generates thumbnail using vips of the source image, always downscales (no upscale), saves the generated /// file to thumbnails folder and returns new ThumbImage Model /// </summary> /// <param name="src">SourceImage</param> /// <param name="width">Width of the image</param> /// <param name="height">Optional Height of the image</param> /// <returns>Empty ThumbImage if no file exists or Created ThumbImage</returns> internal static ThumbImage CreateImage(SourceImage src, int width, int?height = null, int q = 100, Format format = Format.JPEG, bool strip = false) { // Checks, if the source file exists if (src == null && File.Exists(src.AbsolutePath)) { return(new ThumbImage()); } // No uknown formats shall pass! if (src.Format == Format.Unknown || format == Format.Unknown) { return(new ThumbImage()); } // Load Image to Vips Image image = Image.Thumbnail(src.AbsolutePath, width, height, "down", true); //image = image.Copy(); int h = image.Height; int w = image.Width; // Create FileName and Path String fileName = CreateThumbFilename(src, w, h, q, format.ToString().ToLower()); String filePath = FileService.CombineDirectoryAndFilename(GetThumbnailPath(), fileName); switch (format) { case Format.JPEG: image.Jpegsave(filePath, null, q, null, true, true, false, true, null, true, null, strip, new[] { 255.0, 255.0, 255.0 }); break; case Format.GIF: using (MagickImage imImage = new MagickImage(src.AbsolutePath)) { imImage.Resize(w, h); imImage.Quality = q; if (strip) { imImage.Strip(); } imImage.Write(filePath); } break; case Format.PNG: // Compression ratio is inverse of quality between 0 - 9 int pngQ = (q / 10 - 10) * -1; image.Pngsave(filePath, pngQ, false, strip: strip); break; case Format.WebP: if (q == 100) { image.Webpsave(filePath, null, q, true, nearLossless: true, strip: strip); } else { image.Webpsave(filePath, null, q, false, smartSubsample: true, strip: strip); } break; case Format.TIFF: image.Tiffsave(filePath, strip: strip); break; case Format.SVG: return(src.GetOptimizedSVG()); } // Create new ThumbImage Model var thumb = new ThumbImage { AbsolutePath = filePath, AltText = src.AltText, FileName = fileName, RelativePath = $"/thumbnails/{fileName}", Height = h, Width = w, SourceID = src.ID, Format = format, FileSize = new FileInfo(filePath).Length, Quality = q, Stripped = strip }; return(thumb); }