具体情况:我用的LCD为800*600的屏,开发板为S3C2440,摄像头驱动原先为130万像素,现在我想弄成30万像素,改可驱动,结果显示在LCD上的画面是多张相同的画面平铺,就是类似于电脑桌面,原先拉伸的图片变为平铺??请问这是怎么回事??我在注册表中已经把分辨率 设置为800*600了,怎么还是出现上面的情况?我想 是不是因为30万像素的摄像头的分辨率不够,所以造成图象只能平铺??我是新人 不懂 请教了
楼主这个现象我曾经也碰到过,说来给楼主参考下,
以前的屏的分辨率是480*272,显示正常,当换了哥屏,分辨率该为800*480后就出现楼主描述的现象了,在我的板子上出现这个问题的原因是在Camera的驱动问题,我的Camera的驱动中,显示图像的时候,是把摄像头采集到的数据经过转换后,形成RGB16的数据,然后把这个数据拷贝到屏的显示内存,这样来显示图像的,所以在小屏的时候显示正常的驱动,在换了大屏时就不正常了,原因是显存的布局不一样了,把同样的显示信息拷贝到大屏的显存就会出问题,解决的方法,是修改驱动中这里的拷贝方式,
希望对楼主有所帮助
先谢谢楼上两位前辈,我按照你们说的去改下~~有结果再回来结帖~谢谢了~没有分数给,不好意思~
应该是你的CAMERA做了平铺的显示,显存(显示什么)是无辜的只是被你的驱动随便操作了.
有可能是你将CMOS SENSOR的输出改成了30万像素,也就是640*480,但LCD的显示buffer是按你设定的800*600大小进行的,所以复制显示数据的时候每一行需要将多余的点空出来,上面lailzhihou的说法是对的
#if 1
SetKMode(TRUE);
for(y=0;y<640;y++)
{
for (x=0; x<480; x++) // YCbCr 4:2:0 format
{
*(U16*)((U8*)(IMAGE_FRAMEBUFFER_UA_BASE+y*2+640*(479-x)*2))=*(U16*)((U8*)
(buffer_rgb+y*480*2+x*2));
//memcpy((U8 *)(FRAMEBUF_BASE + (y*2)+240*(319-x)*2),(U8 *)(buffer_rgb+y*320*2+x*2),2);
}
}
SetKMode(FALSE);
#endif 拷贝内存数据是指这里吗?如果我把 s2440CAM->CIPRTAREA= PrDstWidth*PrDstHeight;
// LJY, added 040615
// initialization for buffer addresses
y_address = s2440CAM->CICOYSA1;
cb_address = s2440CAM->CICOCBSA1;
cr_address = s2440CAM->CICOCRSA1;
rgb_address = s2440CAM->CIPRCLRSA1;
}中 PrDstWidth的值加大有用吗?因为我显示的时候是有5张图片平铺,高度是对的~宽度是5倍~呵呵~基础不好~实在不好 意思i
void Display_Cam_Image(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y, U8 port)
函数中有一段直接在LCD上显示的语句:#if 1
SetKMode(TRUE);
for (y=0; y
{
//memcpy((void *)(FRAMEBUF_BASE+0x5e00+y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);
memcpy((void *)(IMAGE_FRAMEBUFFER_UA_BASE+ (PREVIEW_X*pos_y + pos_x) + y*PREVIEW_X*2),(void
*)buffer_rgb,(PREVIEW_X)*2);
buffer_rgb += (PREVIEW_X*2);
// RETAILMSG(1,(TEXT("\r\nPREVIEW_X=%d,PREVIEW_Y=%d\r\n"),PREVIEW_X,PREVIEW_Y));
}
SetKMode(FALSE); 然后打印出信息~~我想 你们所说的把多余的点空出来是指,我读到满30W像素的分辨率后,输出全部为空? 我还想问下void Display_Cam_Image2()有什么作用~我看了下好像也是读内存信息吧~那不是和void Display_Cam_Image冲突? 我实在笨的要死
改了后,有效果了 ~原先是5张平铺的~现在可以了~呵呵~谢谢你们~学了很多~