【问题标题】:Byte Array to Bitmap Image字节数组到位图图像
【发布时间】:2012-07-28 15:28:30
【问题描述】:

我编写此代码来接收图像并将其转换为位图图像,但它不起作用。

代码如下:

public void ReceiveImage()
{
    NetworkStream stream = new NetworkStream(socket);
    byte[] data = new byte[4];
    stream.read(data,0,data.length,0)
    int size = BitConverter.ToInt32(data,0);
    data = new byte[size];
    stream.read(data,0,data.length)
    MemoryStream imagestream = new MemoryStream(data);
    Bitmap bmp = new Bitmap(imagestream);
    picturebox1.Image = bmp;
}

它到达:

Bitmap bmp = new Bitmap(imagestream);

并给我这个错误:

参数无效

【问题讨论】:

  • @Tarek...这是 C# 代码吗?当我将它复制到 Visual Studio 中时,它有一些拼写错误。
  • 是的,它的 C#,但您必须使用 System.IO 键入;使用 System.Net.Sockets;使用 System.Net;
  • 并且还使用 System.Drawing.Imaging;
  • 也许您没有收到有效的图像数据?
  • Parameter is not valid 当参数不是有效图像时给出。我认为您阅读文件的方式存在一些问题

标签: c# arrays bitmap byte


【解决方案1】:

这是另一种方法

int w= 100;
int h = 200;
int ch = 3; //number of channels (ie. assuming 24 bit RGB in this case)

byte[] imageData    = new byte[w*h*ch]; //you image data here
Bitmap bitmap       = new Bitmap(w,h,PixelFormat.Format24bppRgb);
BitmapData bmData   = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
IntPtr pNative      = bmData.Scan0;
Marshal.Copy(imageData,0,pNative,w*h*ch);
bitmap.UnlockBits(bmData);

【讨论】:

    【解决方案2】:

    您可能没有在stream.read(data,0,data.length) 中接收到足够的字节,因为Read 不能确保它会读取data.length 字节。你必须检查它的返回值并继续读取直到data.Length字节被读取。

    查看:Stream.Read Method的返回值

    int read = 0;
    while (read != data.Length)
    {
        read += stream.Read(data, read, data.Length - read);
    }
    

    PS:我假设 lengths 和 reads 是拼写错误。

    【讨论】:

    • 发生此错误'无法从传输连接读取数据。由于系统缺少足够的缓冲区空间或队列已满,可能会执行套接字上的操作。'
    • 检查size。它可以在network byte order。你可以试试IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data,0))
    • 不工作,来到'data = new byte[size];'然后给我这个错误'算术运算导致溢出'
    • @TarekAdel 你希望我用你的问题中显示的这么少的信息做什么?好的,我在您的代码中发现了一个明显的错误,但我不是魔术师。您在连接的另一端有什么样的服务器/客户端?它以哪种协议发送图像?
    • 我无法将代码发送给您,因为它有 800 多个字符,我该如何发送给您?如果通过 Facebook,这是我的电子邮件 tarek55544@live.com
    【解决方案3】:

    我假设您有一张桌子并想从数据库中接收图片。

    int cout = ds.Tables["TableName"].Rows.Count;
                    if (cout > 0)
                    {
                        if (ds.Tables["TableName"].Rows[cout - 1]["Image"] != DBNull.Value)
                        {
                            var data = (byte[])(ds.Tables["TableName"].Rows[cout - 1]["Image"]);
                            var stream = new MemoryStream(data);
                            pictureBox1.Image = Image.FromStream(stream);
                        }
                        else
                        {
                            pictureBox1.Image = null;
                        }
                    }
    

    【讨论】:

    • 您的假设可能是错误的。见代码NetworkStream
    【解决方案4】:

    试试这个:

    int size = BitConverter.ToInt32(data.Reverse().ToArray(),0); 
    

    【讨论】:

    • Try this 只是一个评论。 Try this. This should work because... 是一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多