我在做将OV7725的像素数据传输到上位机进行显示的时候,遇到了问题,希望得到大家的指导,下面开始讲述我遇到的问题
1 摄像头的像素格式为RGB565,所以一个像素为16位,我将一个像素数据分为高8位和低8位发送给上位机,下面是代码[C] 纯文本查看 复制代码void ImagDisp(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height)
{
uint16_t i, j;
uint16_t Camera_Data;
uint8_t Data_H, Data_L;
ILI9341_OpenWindow(sx,sy,width,height);
ILI9341_Write_Cmd ( CMD_SetPixel );
printf("FF11FF11FF11");
for(i = 0; i < width; i++)
{
for(j = 0; j < height; j++)
{
READ_FIFO_PIXEL(Camera_Data); /* 从FIFO读出一个rgb565像素到Camera_Data变量 */
ILI9341_Write_Data(Camera_Data);
Data_L = (Camera_Data & 0xFF);
Data_H = ((Camera_Data >> 8) & 0xFF);
printf(&quot;%x&quot;, Data_H);
printf(&quot;%x&quot;, Data_L);
}
}
printf(&quot;EE22EE22EE22&quot;);
while(1);
}
2 然后是上位机处理数据的代码
[C] 纯文本查看 复制代码public Bitmap GetDataPicture(int w, int h,byte[] data)
{
//定义一个BMP格式的图片
Bitmap pic = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format16bppRgb565);
//定义一个像素颜色变量
Color c;
//定义RGB565转变为RGB888的字节数组
byte[] rgb24 = new byte[3];
//这是像素位置变量
ushort j = 0;
for (int i = 0; i < data.Length; i+=2)
{
//将高低8位合并为半字
ushort RGB565_Temp = (ushort)data;
RGB565_Temp = (ushort)((RGB565_Temp << 8) | data[i + 1]);
//进行转换
rgb565_2_rgb24(ref rgb24, RGB565_Temp);
//设置像素
c = Color.FromArgb(rgb24[2], rgb24[1], rgb24[0]);
//将像素写进图片
pic.SetPixel(j % w, j / w, c);
j++;
}
return pic;
}
其中 rgb565_2_rgb24(ref rgb24, RGB565_Temp);代码为
[C] 纯文本查看 复制代码private static void rgb565_2_rgb24(ref byte[] rgb24, ushort rgb565)
{
//uint data;
//extract RGB
rgb24[2] = (byte)((rgb565 & RGB565_MASK_RED) >> 11);
rgb24[1] = (byte)((rgb565 & RGB565_MASK_GREEN) >> 5);
rgb24[0] = (byte)((rgb565 & RGB565_MASK_BLUE));
//amplify the image
rgb24[2] <<= 3;
rgb24[1] <<= 2;
rgb24[0] <<= 3;
//data = (uint)(rgb24[2] << 16 + rgb24[1] << 8 + rgb24[0]);
//return data;
}
不知道哪里出了问题,请大家帮忙看看。 |