ImageConverter.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System.Text;
  2. using System;
  3. using ImageConvertService.ExceptionHandling;
  4. using ImageMagick;
  5. using ImageMagick.Formats;
  6. using ImageConvertService.Biz.Models;
  7. namespace ImageConvertService.Biz;
  8. public class ImageConverter
  9. {
  10. private static readonly WebPWriteDefines WebPDefines = new()
  11. {
  12. Lossless = false,
  13. Method = 6,
  14. };
  15. public byte[] ConvertToWebp(byte[] imageBytes)
  16. {
  17. MagickImage image;
  18. try
  19. {
  20. image = new MagickImage(imageBytes);
  21. }
  22. catch (Exception e)
  23. {
  24. throw new UserFriendlyException("error on reading file", e);
  25. }
  26. using var ms = new MemoryStream();
  27. image.Format = MagickFormat.WebP;
  28. image.Quality = 85;
  29. try
  30. {
  31. image.Write(ms, WebPDefines);
  32. }
  33. catch (Exception e)
  34. {
  35. throw new UserFriendlyException("error on writing file", e);
  36. }
  37. image.Dispose();
  38. return ms.ToArray();
  39. }
  40. public bool ConvertToWebp(List<ArchiveEntry> entries)
  41. {
  42. var lstExceptions = new List<(string pathAndName, Exception exception)>();
  43. Parallel.ForEach(entries, item =>
  44. {
  45. if (item.PathAndName.EndsWith(".webp", StringComparison.OrdinalIgnoreCase)) return;
  46. try
  47. {
  48. item.Content = ConvertToWebp(item.Content);
  49. }
  50. catch (Exception e)
  51. {
  52. lock (lstExceptions) lstExceptions.Add((item.PathAndName, e));
  53. return;
  54. }
  55. item.PathAndName += ".webp";
  56. });
  57. if (lstExceptions.Count == 0) return true;
  58. entries.Add(new ArchiveEntry
  59. {
  60. PathAndName = $"@{nameof(ImageConverter)}.{nameof(ConvertToWebp)}.{lstExceptions.Count}.Errors.{Guid.NewGuid():N}.txt",
  61. Content = Encoding.UTF8.GetBytes(
  62. string.Join($"{Environment.NewLine}{Environment.NewLine}",
  63. lstExceptions.Select(p => $"{p.pathAndName}:{Environment.NewLine} {p.exception}"))
  64. )
  65. });
  66. return false;
  67. }
  68. }