字节数组到位图图像

Posted

技术标签:

【中文标题】字节数组到位图图像【英文标题】: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 当参数不是有效图像时给出。我认为您阅读文件的方式存在一些问题 【参考方案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... 是一个答案。

以上是关于字节数组到位图图像的主要内容,如果未能解决你的问题,请参考以下文章

将html转换为字节数组java中的图像

解释图像的字节数组

字节数组到图像的转换

将 PIL 图像转换为字节数组?

图像到字节数组 - ExternalException

将多字节数组图像数据合并为一个字节数组数据,并将WriteAllBytes合并为单个图像输出