0

我正在开发一个控件,用户可以在其中设置图像,我希望它尽可能地对用户友好-因此支持复制和粘贴、拖放。

我已经让这部分工作使用 IDataObjects,测试 FileDrop、FileContents(例如来自 Outlook)和位图的文件格式,例如:

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;
            }
         }
     }

ImageFromClipboard 代码是 Thomas Levesque 的,在这个 SO 问题wpf InteropBitmap to bitmap的答案中引用

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

无论我如何将图像放到 ImgPerson 上,这部分工作正常;图像显示很好。

当用户按下保存时,我需要将图像转换为字节数组并发送到 WCF 服务器,该服务器将保存到服务器 - 例如,将字节数组重建为图像并将其保存在文件夹中。

对于所有格式的拖放,复制和粘贴图像是某种形式的 System.Windows.Media.Imaging.BitmapImage。

除了那些涉及剪贴板的使用 Thomas 的代码变成 System.Windows.Media.Imaging.BitmapFrameDecode。

如果我避免使用 Thomas 的代码并使用:

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

我得到一个 System.Windows.Interop.InteropBitmap。

我不知道如何使用这些;将它们放入字节数组中,以便我可以传递给 WCF 进行重建并保存到文件夹。

4

2 回答 2

0

我不敢相信我没有看到这个 SO 问题,但这与我的问题基本相同:

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

答案是:

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);

在执行上与 Nitesh 的答案非常相似,但至关重要的是,它与互操作位图一起使用。

于 2013-08-07T04:12:02.053 回答
0

试试这段代码

    public byte[] ImageToBytes(BitmapImage imgSource)
    {
        MemoryStream objMS = new MemoryStream();        
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(imgSource));
        encoder.Save(objMS);
        return objMS.GetBuffer();
    }

您也可以使用JpegBitmapEncoder,BmpBitmapEncoder根据您的要求。

    byte[] arr = ImageToBytes(ImgPerson.Source as BitmapImage);
于 2013-08-05T07:41:04.790 回答