图片处理

mkstronger 2014-07-02 03:32:31
客户端把相机采集到的图像数据通过网络发送给服务器,在服务器端把图像数据放在字节数组中,然后把这些数据转化成BMP图片,在picturebox上显示出来,但是在picturebox上会显示两张甚至多张相同的图片,不知为何,是不是读取图像像素字节顺序有啥问题,求大神解答,急用!下面是我写的字节数组转换成图片的函数:
public static Image byteArrayToImage(Byte[] bt)
{
//bt是我接收到的网络图片数据
byte[] raw_data = new byte[640 * 480 * 3];
for (int i = 0; i < bt.Length; i++)
{
raw_data[i] = bt[i];
raw_data[i + 1] = bt[i];
raw_data[i + 2] = bt[i];
}

GCHandle hObject = GCHandle.Alloc(raw_data, GCHandleType.Pinned);
IntPtr pObject = hObject.AddrOfPinnedObject();
if (hObject.IsAllocated)
{
hObject.Free();
}
BitmapData bmpData = new BitmapData();
bmpData.Width = 640;
bmpData.Height = 480;
bmpData.Scan0 = pObject;
bmpData.PixelFormat = PixelFormat.Format24bppRgb;
bmpData.Stride = 640;
Bitmap bitmap = new Bitmap(bmpData.Width, bmpData.Height, bmpData.Stride, bmpData.PixelFormat, bmpData.Scan0);

return bitmap;
}
...全文
136 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-07-02
  • 打赏
  • 举报
回复
客户端是怎么把图片转成数组的,你就应该按原样转回来 人家是640*480的数组,你这边变成640*480*3的数组,是想闹哪样
於黾 2014-07-02
  • 打赏
  • 举报
回复
引用 4 楼 mkstronger 的回复:
[quote=引用 1 楼 Z65443344 的回复:] for (int i = 0; i < bt.Length; i++) { raw_data[i] = bt[i]; raw_data[i + 1] = bt[i]; raw_data[i + 2] = bt[i]; } 这是闹哪样?
没改过来, raw_data[3*i] = bt[i]; raw_data[3*i + 1] = bt[i]; raw_data[3*i + 2] = bt[i];[/quote] 你确定这3个变量赋值成同一个值? 即使不是ARGB而是RGB(3个字节代表一个像素),每个字节也都是有意义的啊. 除非你上传的图很小,你想等比例放大.
mkstronger 2014-07-02
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
byte[] raw_data = new byte[640 * 480 * 3]; 你也不管相机传上来的数据是多少,就直接给固定长度了? 相机传上来的不是应该ARGB格式,4个字节表示一个像素么,为什么是*3? 总之逻辑很混乱,完全不明白你到底想干什么.
想让图片大小以640*480显示,乘以3,是因为每个像素颜色数据格式按照RGB显示的
mkstronger 2014-07-02
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
for (int i = 0; i < bt.Length; i++) { raw_data[i] = bt[i]; raw_data[i + 1] = bt[i]; raw_data[i + 2] = bt[i]; } 这是闹哪样?
没改过来, raw_data[3*i] = bt[i]; raw_data[3*i + 1] = bt[i]; raw_data[3*i + 2] = bt[i];
ivanho 2014-07-02
  • 打赏
  • 举报
回复
觉得有点不可思议呀……。难道传上来的图片没有做唯一的标识吗?
於黾 2014-07-02
  • 打赏
  • 举报
回复
byte[] raw_data = new byte[640 * 480 * 3]; 你也不管相机传上来的数据是多少,就直接给固定长度了? 相机传上来的不是应该ARGB格式,4个字节表示一个像素么,为什么是*3? 总之逻辑很混乱,完全不明白你到底想干什么.
於黾 2014-07-02
  • 打赏
  • 举报
回复
for (int i = 0; i < bt.Length; i++) { raw_data[i] = bt[i]; raw_data[i + 1] = bt[i]; raw_data[i + 2] = bt[i]; } 这是闹哪样?

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧