我正在开发一个C#.NET应用程序,它将显示从相机(智能相机)捕获的图像。我正在使用下面的函数将从相机接收的原始数据(这是一个字节数组)转换为位图图像。我在下面的代码中遇到的问题是,C#.NET应用程序的图片框(理想情况下应该是实时图像)中显示的图像看起来像电影卷轴并且它一直向右滚动。不知道如何解决这个问题?
private Image ByteArrayToImage(byte[] myByteArray)
{
if (myByteArray != null)
{
MemoryStream ms = new MemoryStream(myByteArray);
int Height = 504; /*The exact height of image from Smart Camera*/
int Width = 664; /*The exact width of image from Smart Camera*/
BitmapData bmpData =
bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.WriteOnly, bmp.PixelFormat);
Marshal.Copy(myByteArray, 0, bmpData.Scan0, myByteArray.Length);
Bitmap bmp = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
BitmapData bmpData =
bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite, bmp.PixelFormat);
int offset = 0;
long ptr = bmpData.Scan0.ToInt64();
for (int i = 0; i < Height; i++)
{
Marshal.Copy(myByteArray, offset, new IntPtr(ptr), Width);
offset += (Width);
ptr += bmpData.Stride;
}
bmp.UnlockBits(bmpData);
return bmp;
}
return null;
}
@Mark,在我用于从相机接收数据的代码段下方找到...
逻辑:我首先收到sizeof图像,然后打开套接字连接n循环,直到我从相机获得sizeof字节。
public static byte[] receivedata(Socket clientSock)
{
if (clientSock != null)
{
byte[] size = new byte[10000000];
byte[] buffer = null;
int ch, received, offset;
try
{
clientSock.Receive(size);
//MessageBox.Show("size array is " + size[0]
// + " " + size[1] + " " + size[2] + " " );
ch = BitConverter.ToInt32(size, 0);
//ch = 334656;
//MessageBox.Show("Sizeofimg = " + ch + "");
buffer = new byte[ch];
//MessageBox.Show("Start receiving image from camera");
received = 0;
offset = 0;
do
{
received += clientSock.Receive(buffer,
offset + received,
ch - received,
SocketFlags.None);
} while (received < ch);
//MessageBox.Show("Received " + received + " values");
System.Threading.Thread.Sleep(50);
}
catch (Exception e)
{
MessageBox.Show("Error receiving ...");
MessageBox.Show(e.StackTrace);
}
return buffer;
}
else
{
return null;
}
}
}
请指出问题...... 提前谢谢。
答案 0 :(得分:0)
“向右滚动”告诉我每个图像都是一致的解码,但连续的图像相互关闭。正确?这意味着问题不在于您向我们展示的代码中,而是在从相机读取的代码中。
编辑:您的宽度和高度似乎有点偏差。我发现的664x504相机的唯一文档指出“活动区域”(实际包含图片的部分)实际上是648x488。如果是这种情况,你的图片似乎也会倾斜一点,因为每一行都会从下一行偏移,并且随着你读取的每一帧都将成为下一帧数据的一部分,它会向上移动。