Search code examples
c#wpfimageinteropbitmapimage

Image/ImageSource/Interop Image to bytearray


I'm developing a control where user can set an image and i want this this to be as user friendly as possible - so support for copy & paste, drag & drop.

I've got this part working using IDataObjects, testing for fileformats of FileDrop, FileContents (eg from outlook), and bitmap eg:

private void GetImageFromIDataObject(IDataObject myIDO)
    {
        string[] dataformats = myIDO.GetFormats();

        Boolean GotImage = false;

        foreach (string df in dataformats)
        {
            if (df == DataFormats.FileDrop)
            {
              // code here
            }
            if (df == DataFormats.Bitmap)
            {
                // Source of my problem here... this gets & displays image but
                // how do I then convert from here ?
                ImageSource myIS = Utilities.MyImaging.ImageFromClipboardDib();
                ImgPerson.Source = myIS;
            }
         }
     }

The ImageFromClipboard code is Thomas Levesque's as referenced in the answer to this SO question wpf InteropBitmap to bitmap

http://www.thomaslevesque.com/2009/02/05/wpf-paste-an-image-from-the-clipboard/

No matter how I get the image onto ImgPerson, this part is working fine; image displays nicely.

When user presses save I need to convert the image to a bytearray and send to a WCF server which will save to server - as in, reconstruct the bytearray into an image and save it in a folder.

For all formats of drag & drop, copy & paste the image is some form of System.Windows.Media.Imaging.BitmapImage.

Except for those involving the clipboard which using Thomas's code becomes System.Windows.Media.Imaging.BitmapFrameDecode.

If I avoid Thomas's code and use:

BitmapSource myBS = Clipboard.GetImage();
ImgPerson.Source = myBS;

I get a System.Windows.Interop.InteropBitmap.

I can't figure out how to work with these; to get them into a bytearray so I can pass to WCF for reconstruction and saving to folder.


Solution

  • I can't believe I didn't see this SO question but the this is essentially the same as my question:

    WPF: System.Windows.Interop.InteropBitmap to System.Drawing.Bitmap

    The answer being:

    BitmapSource bmpSource = msg.ThumbnailSource as BitmapSource;
    MemoryStream ms = new MemoryStream();
    BitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bmpSource));
    encoder.Save(ms);
    ms.Seek(0, SeekOrigin.Begin);
    
    
    System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(ms);
    

    So similar in execution to Nitesh's answer but crucially, works with an inter-op bitmap.