【问题标题】:How to convert ImageSource to Byte array?如何将 ImageSource 转换为 Byte 数组?
【发布时间】:2014-11-08 06:17:56
【问题描述】:

我使用 LeadTools 进行扫描。

我想将扫描图像转换为字节。

void twainSession_AcquirePage(object sender, TwainAcquirePageEventArgs e)
 {
   ScanImage = e.Image.Clone();
   ImageSource source = RasterImageConverter.ConvertToSource(ScanImage, ConvertToSourceOptions.None);
 }

如何将 ImageSource 转换为 Byte 数组?

【问题讨论】:

    标签: c# wpf leadtools-sdk


    【解决方案1】:

    除非您明确需要 ImageSource 对象,否则无需转换为一个。您可以使用以下代码直接从 Leadtools.RasterImage 获取包含像素数据的字节数组:

    int totalPixelBytes = e.Image.BytesPerLine * e.Image.Height;
    byte[] byteArray = new byte[totalPixelBytes];
    e.Image.GetRow(0, byteArray, 0, totalPixelBytes);
    

    请注意,这只会为您提供原始像素数据。

    如果您需要包含完整图像(例如 JPEG)的内存流或字节数组,则也无需转换为源。您可以像这样使用 Leadtools.RasterCodecs 类:

    RasterCodecs codecs = new RasterCodecs();
    System.IO.MemoryStream memStream = new System.IO.MemoryStream();
    codecs.Save(e.Image, memStream, RasterImageFormat.Jpeg, 24);
    

    【讨论】:

      【解决方案2】:

      我在 Xamarin.Forms 中遇到了这个问题,我需要将相机拍摄的照片转换为字节数组。在花了几天时间试图找出方法后,我在 Xamarin 论坛中看到了这个解决方案。

      var photo = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions() { });
      
      byte[] imageArray = null;
      
      using (MemoryStream memory = new MemoryStream()) {
      
          Stream stream = photo.GetStream();
          stream.CopyTo(memory);
          imageArray = memory.ToArray();
      }
      


      来源:https://forums.xamarin.com/discussion/156236/how-to-get-the-bytes-from-the-imagesource-in-xamarin-forms

      【讨论】:

        【解决方案3】:

        如果你使用的是 Xamarin,你可以使用这个:

        public byte[] ImageSourceToBytes(ImageSource imageSource)
        {
            StreamImageSource streamImageSource = (StreamImageSource)imageSource;
            System.Threading.CancellationToken cancellationToken = 
            System.Threading.CancellationToken.None;
            Task<Stream> task = streamImageSource.Stream(cancellationToken);
            Stream stream = task.Result;
            byte[] bytesAvailable = new byte[stream.Length];
            stream.Read(bytesAvailable, 0, bytesAvailable.Length);
            return bytesAvailable;
        }
        

        【讨论】:

        • 当我尝试这个方法时,我得到一个关于流被关闭的错误
        【解决方案4】:

        您似乎可以将结果从 .ConvertToSource 转换为 BitmapSource 而不是 ImageSource。

        我不是 100% 确定这如何转化为您的案例,但 LeadTools 的文档显示了这个 VB 示例:

           Dim source As BitmapSource
           Using raster As RasterImage = RasterImageConverter.ConvertFromSource(bitmap, ConvertFromSourceOptions.None)
              Console.WriteLine("Converted to RasterImage, bits/pixel is {0} and order is {1}", raster.BitsPerPixel, raster.Order)
        
              ' Perform image processing on the raster image using LEADTOOLS
              Dim cmd As New FlipCommand(False)
              cmd.Run(raster)
        
              ' Convert the image back to WPF using default options
              source = DirectCast(RasterImageConverter.ConvertToSource(raster, ConvertToSourceOptions.None), BitmapSource)
           End Using
        

        我觉得应该是这样的

        BitmapSource source = RasterImageConverter.ConvertToSource(ScanImage, ConvertToSourceOptions.None) as BitmapSource;
        

        然后你可以用BitmapSource.CopyPixels复制BitmapSource像素

        【讨论】:

        • 谢谢,但我想将此 t Byte[] 转换为保存在 DB 中。
        【解决方案5】:

        我使用的是 MemoryStream:

        var source = RasterImageConverter.ConvertToSource(ScanImage, ConvertToSourceOptions.None) as BitmapSource;
        byte[] data;
        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(source));
        using (MemoryStream ms = new MemoryStream())
        {
           encoder.Save(ms);
           data = ms.ToArray();
        }
        

        【讨论】:

          【解决方案6】:

          我使用这个类来处理 WPF 中的Image

          public static class ImageHelper
              {
                  /// <summary>
                  /// ImageSource to bytes
                  /// </summary>
                  /// <param name="encoder"></param>
                  /// <param name="imageSource"></param>
                  /// <returns></returns>
                  public static byte[] ImageSourceToBytes(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;
                  }
          
                  [DllImport("gdi32.dll")]
                  [return: MarshalAs(UnmanagedType.Bool)]
                  internal static extern bool DeleteObject(IntPtr value);
          
                  public static BitmapSource GetImageStream(Image myImage)
                  {
                      var bitmap = new Bitmap(myImage);
                      IntPtr bmpPt = bitmap.GetHbitmap();
                      BitmapSource bitmapSource =
                       System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                             bmpPt,
                             IntPtr.Zero,
                             Int32Rect.Empty,
                             BitmapSizeOptions.FromEmptyOptions());
          
                      //freeze bitmapSource and clear memory to avoid memory leaks
                      bitmapSource.Freeze();
                      DeleteObject(bmpPt);
          
                      return bitmapSource;
                  }
          
                  /// <summary>
                  /// Convert String to ImageFormat
                  /// </summary>
                  /// <param name="format"></param>
                  /// <returns></returns>
                  public static System.Drawing.Imaging.ImageFormat ImageFormatFromString(string format)
                  {
                      if (format.Equals("Jpg"))
                          format = "Jpeg";
                      Type type = typeof(System.Drawing.Imaging.ImageFormat);
                      BindingFlags flags = BindingFlags.GetProperty;
                      object o = type.InvokeMember(format, flags, null, type, null);
                      return (System.Drawing.Imaging.ImageFormat)o;
                  }
          
                  /// <summary>
                  /// Read image from path
                  /// </summary>
                  /// <param name="imageFile"></param>
                  /// <param name="imageFormat"></param>
                  /// <returns></returns>
                  public static byte[] BytesFromImage(String imageFile, System.Drawing.Imaging.ImageFormat imageFormat)
                  {
                      MemoryStream ms = new MemoryStream();
                      Image img = Image.FromFile(imageFile);
                      img.Save(ms, imageFormat);
                      return ms.ToArray();
                  }
          
                  /// <summary>
                  /// Convert image to byte array
                  /// </summary>
                  /// <param name="imageIn"></param>
                  /// <param name="imageFormat"></param>
                  /// <returns></returns>
                  public static byte[] ImageToByteArray(System.Drawing.Image imageIn, System.Drawing.Imaging.ImageFormat imageFormat)
                  {
                      MemoryStream ms = new MemoryStream();
                      imageIn.Save(ms, imageFormat);
                      return ms.ToArray();
                  }
          
                  /// <summary>
                  /// Byte array to photo
                  /// </summary>
                  /// <param name="byteArrayIn"></param>
                  /// <returns></returns>
                  public static Image ByteArrayToImage(byte[] byteArrayIn)
                  {
                      MemoryStream ms = new MemoryStream(byteArrayIn);
                      Image returnImage = Image.FromStream(ms);
                      return returnImage;
                  }
              }
          

          因此,请尝试不同的方法并根据需要对此类进行现代化改造。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-07-10
            • 1970-01-01
            • 1970-01-01
            • 2010-12-02
            • 2016-10-01
            • 2017-03-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多