【问题标题】:How to put image in a picture box from a byte[] in C#如何将图像从 C# 中的字节 [] 放入图片框中
【发布时间】:2012-03-23 12:40:35
【问题描述】:

我有一个字节数组,其中包含位图格式的图像二进制数据。如何在 C# 中使用 PictureBox 控件显示它?

我浏览了下面列出的几篇文章,但不确定在将字节数组发送到图片框之前是否需要将其转换为其他内容。我会很感激你的帮助。谢谢!

How to put image in a picture box from Bitmap Load Picturebox Image From Memory?

【问题讨论】:

    标签: c# .net picturebox bitmapimage


    【解决方案1】:

    该函数将字节数组转换为位图,可用于设置图片框的Image属性。

    public static Bitmap ByteToImage(byte[] blob)
    {
        MemoryStream mStream = new MemoryStream();
        byte[] pData = blob;
        mStream.Write(pData, 0, Convert.ToInt32(pData.Length));
        Bitmap bm = new Bitmap(mStream, false);
        mStream.Dispose();
        return bm;
    }
    

    示例用法:

    pictureBox.Image = ByteToImage(byteArr); // byteArr holds byte array value
    

    【讨论】:

    • pData 变量的用途是什么?有a suggested edit删除它,直接使用blob。
    • 这里缺少参数Dim picture As Byte() = GetBytes(ListView2.Items(index).SubItems(8).Text) Dim converter As New ImageConverter() PictureBox1.Image = DirectCast(converter.ConvertFrom(picture), Image)
    • Dim bm As New Bitmap(mStream, False) 参数无效
    【解决方案2】:
    byte[] imageSource = **byte array**;
    Bitmap image;
    using (MemoryStream stream = new MemoryStream(imageSource))
    {
       image = new Bitmap(stream);
    }
    pictureBox.Image = image;
    

    【讨论】:

    • 我认为这是一个错误的答案。位图构造函数的文档清楚地指出You must keep the stream open for the lifetime of the Bitmap. 显然在这个答案中,甚至在使用图像之前就关闭了流。请参阅此处的文档:msdn.microsoft.com/en-us/library/z7ha67kw(v=vs.110).aspx
    • 正确,内存区域的流查看器(字节 [] 的包装器)已关闭,但到那时,位图现在将该内存块设置为图像。处理流不会破坏底层内存或释放它。直到 byte[] 本身被垃圾收集器释放或声明后,它才会被销毁。即使在接受的答案中,他们也会在返回位图之前处理流。
    【解决方案3】:
    using System.IO;
    byte[] img = File.ReadAllBytes(openFileDialog1.FileName);
    MemoryStream ms = new MemoryStream(img);
    pictureBox1.Image = Image.FromStream(ms);
    

    或者你可以直接这样访问,

    pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);

    【讨论】:

      【解决方案4】:

      您也可以像这样将pictureBox图像转换为字节数组,

      MemoryStream ms = new MemoryStream();
      pictureBox1.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
      byte[] img = ms.ToArray();
      

      【讨论】:

        【解决方案5】:

        System.Drawing 命名空间中的 ImageConverter 类可以进行转换:

        byte[] imageArray = **byte array**
        ImageConverter converter = new ImageConverter();
        pictureButton.Image = (Image)converter.ConvertFrom(imageArray);
        

        【讨论】:

        • 这里缺少参数Dim picture As Byte() = GetBytes(ListView2.Items(index).SubItems(8).Text) Dim converter As New ImageConverter() PictureBox1.Image = DirectCast(converter.ConvertFrom(picture), Image)
        • 参数在最后一行无效
        【解决方案6】:

        如果你想使用 BinaryReader 来转换那么就这样使用,

        FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);

        BinaryReader br = new BinaryReader(fs);

        byte[] img = br.ReadBytes((int)fs.Length);

        【讨论】:

          【解决方案7】:

          尝试将位图图像转换为 jpeg 图片和 png 文件类型的字节数组:

          public byte[] UdfConvertPicToByte(Bitmap bitmapImages)
              {
                  using (MemoryStream stream = new MemoryStream())
                  {
                      
                  bitmapImages.Compress(Bitmap.CompressFormat.Png, 0, stream);
                      byte[] bitmapData = stream.ToArray();
          
                      bitmap.Compress(Bitmap.CompressFormat.Jpeg, 50, stream);
                      bitmapData  = stream.ToArray();              
          
                      return bitmapData;
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 2010-10-19
            • 2015-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-14
            • 2014-07-17
            • 1970-01-01
            相关资源
            最近更新 更多