2010-07-13 3 views
2

Как преобразовать объект WPF WriteableBitmap в System.Drawing.Image?WPF/WinForms/GDI interop: преобразование 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 Из этих данных.

// Web service side: 

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

ответ

3

этот блог post показывает, как кодировать WriteableBitmap как изображение JPEG. Может быть, это помогает?

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

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

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

+0

Спасибо. Я буду играть и посмотреть, поможет ли это. –

+0

Хорошо, это сработало. Спасибо за помощь. –

3

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

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

EDIT:

Поскольку вы отправляете растрового изображения на веб-сервиса, я предлагаю вам кодировать его, чтобы начать с. В пространстве имен 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)); 

Надежда, что помогает.

+0

Мои данные - это просто wpfWriteableBitmap.Pixels, который возвращает int [] –

+0

Я обновил свой ответ на примере того, как кодировать растровое изображение перед его отправкой и как его декодировать в веб-службе. –

0

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