ByteArrayToImageSourceConverter.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using System.Globalization;
  2. using Avalonia;
  3. using Avalonia.Data.Converters;
  4. using Avalonia.Media;
  5. using Avalonia.Media.Imaging;
  6. using Avalonia.Platform;
  7. using SkiaSharp;
  8. namespace InABox.Avalonia.Converters;
  9. public class ByteArrayToImageSourceConverter : AbstractConverter<byte[]?, IImage?>
  10. {
  11. public static ByteArrayToImageSourceConverter Instance { get; } = new();
  12. public bool Transparent { get; set; } = false;
  13. public IImage? Convert(byte[]? value)
  14. {
  15. Bitmap? result = null;
  16. if (value?.Any() == true)
  17. {
  18. if (Transparent)
  19. {
  20. var skb = SKBitmap.Decode(value);
  21. var transparentColor = skb.GetPixel(0, 0);
  22. var newPixels = skb.Pixels.Select(x => Equals(x, transparentColor) ? SKColors.Transparent : x);
  23. skb.Pixels = newPixels.ToArray();
  24. SKImage image = SKImage.FromPixels(skb.PeekPixels());
  25. SKData encoded = image.Encode(SKEncodedImageFormat.Png, 100);
  26. value = encoded.ToArray();
  27. }
  28. try
  29. {
  30. using var stream = new MemoryStream(value);
  31. result = new Bitmap(stream);
  32. }
  33. catch(Exception e)
  34. {
  35. MobileLogging.Log(e);
  36. return null;
  37. }
  38. }
  39. return result;
  40. }
  41. protected override IImage? Convert(byte[]? value, object? parameter = null)
  42. {
  43. return Convert(value);
  44. }
  45. }