字节数组转换为位图图像

8
我制作了这段代码来接收一张图像并将其转换为位图图像,但它无法正常工作。
以下是代码:
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中时,它有一些拼写错误。 - MikeTWebb
是的,它是C# ,但是你必须输入以下代码: using System.IO; using System.Net.Sockets; using System.Net; - Tarek Adel
同时使用 System.Drawing.Imaging; - Tarek Adel
也许您没有收到有效的图像数据? - Hogan
当参数不是有效图像时,会给出“参数无效”的消息。我认为您读取文件的方式存在问题。 - David Esteves
4个回答

9

这是一种替代的方法

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);

1

可能是因为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);
}

顺便说一下:我猜测 lengthread 是打错字了。


检查 size。它可能是以网络字节顺序表示的。您可以尝试使用 IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data,0)) - L.B
@TarekAdel 你对于问题提出的信息这么少,我应该怎么做呢?好吧,我已经在你的代码中找到了一个明显的错误,但我不是魔术师。您的连接另一端使用什么类型的服务器/客户端?它使用哪种协议发送图像? - L.B
我无法发送代码给你,因为它超过了800个字符,我该如何将其发送给你?如果通过Facebook,这是我的电子邮件tarek55544@live.com - Tarek Adel
@TarekAdel,Stack Overflow不是这样工作的。如果你想要一个答案,请在这里发布代码(或者其他地方并提供链接)。但请考虑:“这些信息足以回答我的问题吗”。 - L.B
我无法发布代码,因为它超过了800个字符的限制,而我只能发布不超过600个字符的内容。 - Tarek Adel
显示剩余2条评论

0

我假设您有一个表格,并希望从数据库中获取图片。

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;
                    }
                }

1
你的假设可能是错误的。请查看代码中的 NetworkStream - L.B

-1

试试这个:

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

6
"Try this" 只是一条评论。 "试试这个。 这应该有效,因为..." 是一条回答。 - L.B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接