WPF图像到byte

我正在尝试从System.Windows.Controls.Image转换为byte[] ,我不知道Image类中哪个方法可以帮助这个场景,顺便说一下我真的不知道该怎么做,因为我的LINQ模型该字段显示为Binary类型,如果我想将其保存为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 }; 

真正的解决方案…当您的ORM上的数据库映射字段为Byte [] / byte [] / Bynary时,如果要从System.Windows.Control.Image保存jpg图像

 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) 

希望有帮助:)

我不知道你的Image是如何声明的,但假设我们有这个XAML声明:

      

然后你可以将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); 
 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; } } 
 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]

这对我有用:

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

您还可以使用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); 

我喜欢命名空间中的编码器和解码器: 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();