字节数组到位图图像
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:我假设 length
s 和 read
s 是拼写错误。
【讨论】:
发生此错误'无法从传输连接读取数据。由于系统缺少足够的缓冲区空间或队列已满,可能会执行套接字上的操作。' 检查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...
是一个答案。以上是关于字节数组到位图图像的主要内容,如果未能解决你的问题,请参考以下文章