ImageConverter.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. try
  29. {
  30. image.Write(ms, WebPDefines);
  31. }
  32. catch (Exception e)
  33. {
  34. throw new UserFriendlyException("error on writing file", e);
  35. }
  36. image.Dispose();
  37. return ms.ToArray();
  38. }
  39. public bool ConvertToWebp(List<ArchiveEntry> entries)
  40. {
  41. var lstExceptions = new List<(string pathAndName, Exception exception)>();
  42. Parallel.ForEach(entries, item =>
  43. {
  44. if (item.PathAndName.EndsWith(".webp", StringComparison.OrdinalIgnoreCase)) return;
  45. try
  46. {
  47. item.Content = ConvertToWebp(item.Content);
  48. }
  49. catch (Exception e)
  50. {
  51. lock (lstExceptions) lstExceptions.Add((item.PathAndName, e));
  52. return;
  53. }
  54. item.PathAndName += ".webp";
  55. });
  56. if (lstExceptions.Count == 0) return true;
  57. entries.Add(new ArchiveEntry
  58. {
  59. PathAndName = $"@{nameof(ImageConverter)}.{nameof(ConvertToWebp)}.{lstExceptions.Count}.Errors.{Guid.NewGuid():N}.txt",
  60. Content = Encoding.UTF8.GetBytes(
  61. string.Join($"{Environment.NewLine}{Environment.NewLine}",
  62. lstExceptions.Select(p => $"{p.pathAndName}:{Environment.NewLine} {p.exception}"))
  63. )
  64. });
  65. return false;
  66. }
  67. }