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();