2009-02-16 2 views
12

Я пытаюсь преобразовать из System.Windows.Controls.Image в byte[], и я не знал, какой метод из класса Image мог бы помочь в этом сценарии, кстати, я действительно не знаю, что мне делать, вызывают в моей LINQ модель поле появляется как Binary типа, я должен изменить это, если я хочу сохранить его как тип byte[]?WPF Image to byte []

Я нашел код размещен здесь, но без использования WPF:

Bitmap newBMP = new Bitmap(originalBMP, newWidth, newHeight); 
System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
newBMP.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); 
PHJProjectPhoto myPhoto = new PHJProjectPhoto { 
    ProjectPhoto = stream.ToArray(), // <<--- This will convert your stream to a byte[] 
    OrderDate = DateTime.Now, 
    ProjectPhotoCaption = ProjectPhotoCaptionTextBox.Text, 
    ProjectId = selectedProjectId 
}; 

ответ

29

Реальное решение ... если вы хотите сохранить jpg-изображения из System.Windows.Control.Image, когда ваше поле сопоставлено с базой данных на вашем ОРМ является Byte []/байт []/Bynary

public byte[] getJPGFromImageControl(BitmapImage imageC) 
{ 
     MemoryStream memStream = new MemoryStream();    
     JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(imageC)); 
     encoder.Save(memStream); 
     return memStream.ToArray(); 
} 

вызов как:

getJPGFromImageControl(firmaUno.Source as BitmapImage) 

Hopes помогает :)

+0

как насчет windows-8 ??? – Suny

+0

Хорошо 1+ :-) – Sunny

+0

да ... но довольно медленно, 470+ miliseconds ... :( – lauCosma

11

Я не знаю, как декларируется ваше изображение, но предположим, что мы имеем это XAML объявление:

<Image x:Name="img"> 
    <Image.Source> 
     <BitmapImage UriSource="test.png" /> 
    </Image.Source> 
</Image> 

Тогда вы может преобразовать содержимое test.png в байт-массив как это:

var bmp = img.Source as BitmapImage; 

int height = bmp.PixelHeight; 
int width = bmp.PixelWidth; 
int stride = width * ((bmp.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 
bmp.CopyPixels(bits, stride, 0); 
+0

мой XAML является: Im, устанавливающий источник в codebehind, так что лучше? –

+0

Сюрприз: 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ... :/ –

+0

Это работает. Спасибо gix –

1
public byte[] BufferFromImage(BitmapImage imageSource) 
{   
    Stream stream = imageSource.StreamSource; 
    byte[] buffer = null; 

    if (stream != null && stream.Length > 0) 
    { 
     using (BinaryReader br = new BinaryReader(stream)) 
     { 
      buffer = br.ReadBytes((Int32)stream.Length); 
     } 
    } 

    return buffer; 
} 

было бы другим способом, но разница в том, что у них меньше байтов [x], чем первое решение

+2

Я думаю, это зависит от того, как вы инициализируете изображение. Если вы установили BitmapImage StreamSource, это будет null. – gix

+1

Я устанавливаю изображение.Источник как BitmapImage и получив нулевое BitmapImage, я также попытался использовать BitmapImage, каков обходной путь для этого? Это похоже на недопустимый листинг, но я вижу это решение повсюду, включая http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/dee0e287-b345-4e01-888a-ecfb9c3f40b0/. – TheWolf

1

Это работает для меня:

MemoryStream stream = (MemoryStream)bitmapImage.StreamSource; 
byte[] data = stream.ToArray(); 
1

Вы можете также использовать BitmapSources CopyPixels метод игровая

int stride = snapshot.PixelWidth * (snapshot.Format.BitsPerPixel/8); 
byte[] data = new byte[stride * snapshot.PixelHeight]; 
snapshot.CopyPixels(data, stride, 0); 
var memoryStream = new MemoryStream(data); 
2
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void btnBrowse_Click(object sender, RoutedEventArgs e) 
    { 
     var of = new OpenFileDialog(); 
     of.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*"; 
     var res = of.ShowDialog(); 
     if (res.HasValue) 
     { 
      imgPreview.Source = new BitmapImage(new Uri(of.FileName)); 

      var t = Utils.ConvertBitmapSourceToByteArray(imgPreview.Source as BitmapSource); 
      var d = Utils.ConvertBitmapSourceToByteArray(new BitmapImage(new Uri(of.FileName))); 
      var s = Utils.ConvertBitmapSourceToByteArray(imgPreview.Source); 
      var enc = Utils.ConvertBitmapSourceToByteArray(new PngBitmapEncoder(), imgPreview.Source); 
      //imgPreview2.Source = Utils.ConvertByteArrayToBitmapImage(enc); 
      imgPreview2.Source = Utils.ConvertByteArrayToBitmapImage2(enc); 
      //var i = 0; 


     } 
     else 
     { 
      MessageBox.Show("Select a currect file..."); 

     } 
    } 

} 

/util.cs/

public class Utils 
{ 
    public static byte[] ConvertBitmapSourceToByteArray(BitmapEncoder encoder, ImageSource imageSource) 
    { 
     byte[] bytes = null; 
     var bitmapSource = imageSource as BitmapSource; 

     if (bitmapSource != null) 
     { 
      encoder.Frames.Add(BitmapFrame.Create(bitmapSource)); 

      using (var stream = new MemoryStream()) 
      { 
       encoder.Save(stream); 
       bytes = stream.ToArray(); 
      } 
     } 

     return bytes; 
    } 

    public static byte[] ConvertBitmapSourceToByteArray(BitmapSource image) 
    { 
     byte[] data; 
     BitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(image)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      encoder.Save(ms); 
      data = ms.ToArray(); 
     } 
     return data; 
    } 
    public static byte[] ConvertBitmapSourceToByteArray(ImageSource imageSource) 
    { 
     var image = imageSource as BitmapSource; 
     byte[] data; 
     BitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(image)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      encoder.Save(ms); 
      data = ms.ToArray(); 
     } 
     return data; 
    } 
    public static byte[] ConvertBitmapSourceToByteArray(Uri uri) 
    { 
     var image = new BitmapImage(uri); 
     byte[] data; 
     BitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(image)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      encoder.Save(ms); 
      data = ms.ToArray(); 
     } 
     return data; 
    } 
    public static byte[] ConvertBitmapSourceToByteArray(string filepath) 
    { 
     var image = new BitmapImage(new Uri(filepath)); 
     byte[] data; 
     BitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(image)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      encoder.Save(ms); 
      data = ms.ToArray(); 
     } 
     return data; 
    } 

    public static BitmapImage ConvertByteArrayToBitmapImage(Byte[] bytes) 
    { 
     var stream = new MemoryStream(bytes); 
     stream.Seek(0, SeekOrigin.Begin); 
     var image = new BitmapImage(); 
     image.BeginInit(); 
     image.StreamSource = stream; 
     image.EndInit(); 
     return image; 
    } 
} 
0

Мне нравится кодеры и декодеры из пространства имен: System.Windows.Media.Imaging

public static class Extensions {   

    public static byte[] ToByteArray(this BitmapSource bitmapSource) { 

     var encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(bitmapSource)); 

     using (var stream = new MemoryStream()) { 
      encoder.Save(stream); 
      return stream.ToArray(); 
     } 
    } 

    public static BitmapSource ToBitmapSource(this byte[] bytes) { 

     using (var stream = new MemoryStream(bytes)) { 
      var decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.Default); 
      return decoder.Frames.First(); 
     } 
    } 
} 

Вы можете использовать его как это:

var bytes = bitmapSource.ToByteArray(); 

Или так:

var bitmapSource = bytes.ToBitmapSource(); 

 Смежные вопросы

  • Нет связанных вопросов^_^