ClipboardController.cs 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.IO;
  2. using System.Linq;
  3. using System.Windows;
  4. using System.Windows.Media.Imaging;
  5. using PixiEditor.Models.ImageManipulation;
  6. using PixiEditor.Models.Layers;
  7. using PixiEditor.Models.Position;
  8. using PixiEditor.ViewModels;
  9. namespace PixiEditor.Models.Controllers
  10. {
  11. public static class ClipboardController
  12. {
  13. /// <summary>
  14. /// Copies selection to clipboard in PNG, Bitmap and DIB formats.
  15. /// </summary>
  16. /// <param name="layers">Layers where selection is</param>
  17. /// <param name="selection"></param>
  18. /// <param name="originalImageWidth">Output </param>
  19. /// <param name="originalImageHeight"></param>
  20. public static void CopyToClipboard(Layer[] layers, Coordinates[] selection, int originalImageWidth, int originalImageHeight)
  21. {
  22. Clipboard.Clear();
  23. var combinedBitmaps = BitmapUtils.CombineLayers(layers, originalImageWidth, originalImageHeight);
  24. using (var pngStream = new MemoryStream())
  25. {
  26. var data = new DataObject();
  27. var croppedBmp = BitmapSelectionToBmpSource(combinedBitmaps, selection);
  28. data.SetData(DataFormats.Bitmap, croppedBmp, true); //Bitmap, no transparency support
  29. var encoder = new PngBitmapEncoder();
  30. encoder.Frames.Add(BitmapFrame.Create(croppedBmp));
  31. encoder.Save(pngStream);
  32. data.SetData("PNG", pngStream, false); //PNG, supports transparency
  33. Clipboard.SetImage(croppedBmp); //DIB format
  34. Clipboard.SetDataObject(data, true);
  35. }
  36. }
  37. /// <summary>
  38. /// Pastes image from clipboard into new layer.
  39. /// </summary>
  40. public static void PasteFromClipboard()
  41. {
  42. var image = GetImageFromClipboard();
  43. if (image != null) AddImageToLayers(image);
  44. }
  45. /// <summary>
  46. /// Gets image from clipboard, supported PNG, Dib and Bitmap
  47. /// </summary>
  48. /// <returns>WriteableBitmap</returns>
  49. public static WriteableBitmap GetImageFromClipboard()
  50. {
  51. var dao = (DataObject) Clipboard.GetDataObject();
  52. WriteableBitmap finalImage = null;
  53. if (dao.GetDataPresent("PNG"))
  54. using (var pngStream = dao.GetData("PNG") as MemoryStream)
  55. {
  56. if (pngStream != null)
  57. {
  58. var decoder = new PngBitmapDecoder(pngStream, BitmapCreateOptions.IgnoreImageCache,
  59. BitmapCacheOption.OnLoad);
  60. finalImage = new WriteableBitmap(decoder.Frames[0].Clone());
  61. }
  62. }
  63. else if (dao.GetDataPresent(DataFormats.Dib))
  64. finalImage = new WriteableBitmap(Clipboard.GetImage()!);
  65. else if (dao.GetDataPresent(DataFormats.Bitmap))
  66. finalImage = new WriteableBitmap((dao.GetData(DataFormats.Bitmap) as BitmapSource)!);
  67. return finalImage;
  68. }
  69. public static bool IsImageInClipboard()
  70. {
  71. var dao = (DataObject) Clipboard.GetDataObject();
  72. if (dao == null) return false;
  73. return dao.GetDataPresent("PNG") || dao.GetDataPresent(DataFormats.Dib) ||
  74. dao.GetDataPresent(DataFormats.Bitmap);
  75. }
  76. private static void AddImageToLayers(WriteableBitmap image)
  77. {
  78. ViewModelMain.Current.BitmapManager.AddNewLayer("Image", image);
  79. }
  80. public static BitmapSource BitmapSelectionToBmpSource(WriteableBitmap bitmap, Coordinates[] selection)
  81. {
  82. var offsetX = selection.Min(x => x.X);
  83. var offsetY = selection.Min(x => x.Y);
  84. var width = selection.Max(x => x.X) - offsetX + 1;
  85. var height = selection.Max(x => x.Y) - offsetY + 1;
  86. return bitmap.Crop(offsetX, offsetY, width, height);
  87. }
  88. }
  89. }