【问题标题】:WPF Image to byte[]WPF图像到字节[]
【发布时间】:2023-03-29 07:30:02
【问题描述】:

我正在尝试从 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
};

【问题讨论】:

    标签: c# wpf image bytearray


    【解决方案1】:

    真正的解决方案...如果要在 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)
    

    希望有帮助:)

    【讨论】:

    • 是的...但是相当慢,470+ 毫秒...:(
    【解决方案2】:

    我不知道你的 Image 是如何声明的,但假设我们有这个 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);
    

    【讨论】:

    • 我的 xaml 是: 我在代码隐藏中设置源代码,那么哪个更好?
    • 惊喜是节省:0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    • 我更喜欢这种方法,因为我们可以将任何文件类型保存到 byteArray :)
    【解决方案3】:
    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]比第一个解决方案少

    【讨论】:

    • 我认为这取决于您如何初始化图像。如果你设置了一个 BitmapImage StreamSource 似乎为空。
    • 我将 Image.Source 设置为 BitmapImage 并返回一个空 BitmapImage,我还尝试转换为 BitmapImage,解决方法是什么?这似乎是一个无效的演员表,但我到处都能看到这个解决方案,包括 social.msdn.microsoft.com/Forums/en-US/wpf/thread/…
    【解决方案4】:
    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;
        }
    }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        这对我有用:

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

        【讨论】:

          【解决方案7】:

          你也可以使用 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);
          

          【讨论】:

            猜你喜欢
            • 2018-07-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-16
            • 1970-01-01
            • 1970-01-01
            • 2011-06-08
            • 2015-12-08
            相关资源
            最近更新 更多