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 コードは、この SO の質問wpf InteropBitmap to bitmapへの回答で参照されている Thomas Levesque のものです。

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 になるクリップボードを含むものを除きます。

トーマスのコードを避けて使用する場合:

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

System.Windows.Interop.InteropBitmap を取得します。

これらの操作方法がわかりません。それらをbytearrayに入れ、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 に答える