求助 关于C# byte数组转化为image的相关问题!

Arron_0021 2018-11-21 04:52:50
如题,这个学期在做一个图像采集项目 要做一个上位机 下位机用Ov7670拍照并传给stm32单片机 处理后将image转化的对应的byte数组通过串口发送给上位机 上位机的重点是把byte数组转化为image图像。

在编程之前参考了csdn上一个博主的博客: https://blog.csdn.net/u011964923/article/details/50967351
看完以后虽然没有完全明白,并且运行也有一定的问题(setpixel函数的y出错),但是打算用类似的逻辑根据自己的项目情况写一个byte转image的C#窗体应用程序。


尝试运行后出错的语句:



原博主的传输方法是:用了RGB565三个分量取高四位的均值。将两个像素拼接在一起,放在一个unsigned char变量里,前一像素的4位灰度值放在高四位,后一像素放在低四位。 这样就只需要传输320 * 240 / 2 = 38400个byte就可以了。

由于我的项目需要识别图像中的二维码,对清晰度有一定的要求,因此下位机传送的是每个像素RGB565的前8位,传送的是120X160图像大小的数据。在写完程序后测试发现不能正常地显示图像,因此想来论坛上请教一下,附上byte转image部分的代码。

测试的时候采用的图像大小不够120X160,但是显示的部分明显不对:




原博主的代码(用了RGB565三个分量取高四位的均值。将两个像素拼接在一起,放在一个unsigned char变量里,前一像素的4位灰度值放在高四位,后一像素放在低四位):


for (int i = 0; i < ReceivedData.Length; i++)
{
Int32 Row = tbxRecvData.TextLength / 3 /160;
Int32 DataH = (ReceivedData[i] >> 4) * 17;
Int32 DataL = (ReceivedData[i] & 0x0f) * 17;
RecvDataText += (ReceivedData[i].ToString("X2") + " ");//长度变成了3倍!



//高4位是一个像素
Color newColorH = Color.FromArgb(DataH, DataH, DataH);
OvImage.SetPixel(Row, i * 2, newColorH);

//低4位是下一个像素
Color newColorL = Color.FromArgb(DataL, DataL, DataL);
OvImage.SetPixel(Row, i * 2 + 1, newColorL);

}



我自己修改的程序:(取每个像素RGB565的前8位)(下位机数据的顺序逻辑是从图片左上角从上到下产生像素数据,一列数据结束后再从左到右转换byte,图片大小是120X160(宽度X高度)


for (int i = 0; i < ReceivedData.Length; i++)
{
double column1 = Math.Ceiling((double)i /160); //计算列数
Int32 column = (int)column1;
Int32 row = (i % 160); //计算行数



Int32 DataH = ReceivedData[i]

RecvDataText += (ReceivedData[i].ToString("X2") + " ");//长度变成了3倍!



Color newColorH = Color.FromArgb(DataH, DataH, DataH);
OvImage.SetPixel(column, row, newColorH); //setpixel的x和y即为行和列数

}



请问我自己的程序应该怎么修改呢 ,感觉是Int32 DataH的地方出了问题 = = (同时也不太懂原作者那里的程序,为什么在取出上4位和下4位数据后要乘以17 )
...全文
239 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Arron_0021 2018-11-22
  • 打赏
  • 举报
回复
好的 谢谢楼上的大佬
英雄@末路 2018-11-22
  • 打赏
  • 举报
回复
c#的论坛在这:
https://bbs.csdn.net/forums/CSharp
Arron_0021 2018-11-21
  • 打赏
  • 举报
回复
今天回来测试了一下 连上了开发板(含有stm32单片机和ov7670)进行测试,一开始由于忘记修改图像像素大小(之前改了下写的是240X320)导致图像显示模糊,而且显示的图像大小也有问题:





经过调整后(将显示的bitmap像素大小修改为120X160) 用摄像头对准二维码:


上位机显示部分居然能显示出部分的二维码:


而且清晰度也还是可以的:


目前为止 最主要的问题就是 采集的图像不能完整的显示出来,有大神知道这个是什么问题么?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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