Взаимодействие WPF / WinForms / GDI: преобразование WriteableBitmap в System.Drawing.Image? - PullRequest
2 голосов
/ 13 июля 2010

Как я могу преобразовать объект WPF WriteableBitmap в System.Drawing.Image?

Мое клиентское приложение WPF отправляет растровые данные в веб-службу, и для этого веб-службе необходимо создать System.Drawing.Image.

Я знаю, что могу получить данные WriteableBitmap, отправить информацию в веб-сервис:

// WPF side:

WriteableBitmap bitmap = ...;
int width = bitmap.PixelWidth;
int height = bitmap.PixelHeight;
int[] pixels = bitmap.Pixels;

myWebService.CreateBitmap(width, height, pixels);

Но на стороне веб-службы я не знаю, как создать System.Drawing.Image из этих данных.

// Web service side:

public void CreateBitmap(int[] wpfBitmapPixels, int width, int height)
{
   System.Drawing.Bitmap bitmap = ? // How can I create this?
}

Ответы [ 3 ]

3 голосов
/ 14 июля 2010

Если ваши растровые данные несжатые, вы, вероятно, можете использовать этот конструктор System.Drawing.Bitmap: Растровое изображение (Int32, Int32, Int32, PixelFormat, IntPtr) .

Если растровое изображение закодировано в формате jpg или png, создайте MemoryStream из данных растрового изображения и используйте его с конструктором Bitmap (Stream) .

РЕДАКТИРОВАТЬ:

Поскольку вы отправляете растровое изображение в веб-службу, я предлагаю вам сначала его кодировать. В пространстве имен System.Windows.Media.Imaging есть несколько кодеров. Например:

    WriteableBitmap bitmap = ...;
    var stream = new MemoryStream();               
    var encoder = new JpegBitmapEncoder(); 
    encoder.Frames.Add( BitmapFrame.Create( bitmap ) ); 
    encoder.Save( stream ); 
    byte[] buffer = stream.GetBuffer(); 
    // Send the buffer to the web service   

На принимающей стороне просто:

    var bitmap = new System.Drawing.Bitmap( new MemoryStream( buffer ) );

Надеюсь, это поможет.

3 голосов
/ 13 июля 2010

этот блог пост показывает, как кодировать ваш WriteableBitmap в виде изображения в формате JPEG. Возможно, это помогает?

Если вы действительно хотите передать необработанные данные изображения (пиксели), вы можете:

  1. создать System.Drawing.Bitmap с правильным размером
  2. переберите ваши необработанные данные, преобразуйте необработанные данные в System.Drawing.Color (например, через Color.FromArgb () и установите цвет каждого пикселя во вновь созданном изображении через SetPixel ( )

Я бы определенно предпочел первое решение (описанное в сообщении в блоге).

0 голосов
/ 13 февраля 2013

Вопрос для WPF, и Pixels не является свойством WriteableBitmap. Некоторые ответы здесь указывают на статьи SilverLight, поэтому я подозреваю, что между WPF и SilverLight может быть разница.

...