3432|4

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

在640*480 分辨率下用dirext video frame buffer直接写屏的问题 [复制链接]

各位大佬

有段代码我用在320*240的分辨率下非常好用,可是到了640*480的屏幕,输出的画面就变成两个了。不知道是什么问题,请各位看看



这是初始化函数
struct ezfb {
        HRESULT             res_handle ;   // direct draw api result
        LPDIRECTDRAW        dd_ptr ;       // direct draw object ptr
        DDSURFACEDESC       dds_desc ;    // direct draw surface desc obj
        LPDIRECTDRAWSURFACE dds_ptr ;      // direct draw surface ptr
        u_short*   vga_ptr ;    // points to frame buffer of screen
        u_int    scr_width ;
        u_int    scr_height ;
        u_int    scr_bpp ;
};


int ezfb_init(struct ezfb* fb, HWND wnd_handle)
{
        DDCAPS dd_caps ;
        DDCAPS dd_hel_caps ;
        // init fb value
        fb->vga_ptr = NULL ;
        fb->dd_ptr = NULL ;  
        fb->dds_ptr = NULL ;
        fb->scr_width = 0 ;
        fb->scr_height = 0 ;
        fb->scr_bpp = 0 ;
        // create direct draw object
        fb->res_handle = DirectDrawCreate(NULL, &(fb->dd_ptr), NULL);
        if (fb->res_handle != DD_OK)
                return EZFB_FAIL_CREATE_DD ;
        // Get exclusive mode
       
        fb->res_handle = (fb->dd_ptr)->SetCooperativeLevel(wnd_handle, DDSCL_FULLSCREEN);
        if (fb->res_handle != DD_OK)
                return EZFB_FAIL_SET_FULLSCREEN ;

        // make sure the direct draw is valid
        (fb->dd_ptr)->GetCaps(&dd_caps, &dd_hel_caps) ;
        if (!(dd_caps.ddsCaps.dwCaps & DDSCAPS_VALID))
                return EZFB_FAIL_GET_DD_INFO ;

        // create the main framebuffer surface
        memset(&(fb->dds_desc), 0, sizeof(fb->dds_desc)) ;
        (fb->dds_desc).dwSize = sizeof(fb->dds_desc) ;
        (fb->dds_desc).dwFlags = DDSD_CAPS ;
        (fb->dds_desc).ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE ;
        fb->res_handle = (fb->dd_ptr)->CreateSurface(&(fb->dds_desc), &(fb->dds_ptr), NULL) ;
        if (fb->res_handle != DD_OK)
                return EZFB_FAIL_CREATE_DDS ;
        if(EZFB_LOCK(fb) != DD_OK) return EZFB_FALSE ;
        // save screen necessary params
        fb->scr_bpp = fb->dds_desc.ddpfPixelFormat.dwRGBBitCount ;

        EZFB_MAP(fb) ;
        EZFB_UNLOCK(fb) ;
        return EZFB_TRUE ;  
}

然后以后的代码直接把画面内容写入(fb->dds_ptr)即可在屏幕上显示图像了。

在VGA的尺寸下,图像是2个缩得非常小的画面,而在QVGA尺寸下,图像很正常。请教各位大佬。

最新回复

这个问题我碰到过 1.首先你要了解你的摄像头输出地源图像是多少,也就是从摄像头你能得到多大的图像,这个一般在头文件里有设置。 如,你的摄像头输出640*480的 那么设置如下 #define CAM_SRC_HSIZE                                        (640) #define CAM_SRC_VSIZE                                        (480) 这只是个例子,你的源图片文件名称也许不是这样。如果你的摄像头是130万像素,也就是可以支持1280*1024的话 源图像也有可能是这个 ,你要好好查查。 2.其次,要确定你要预览的图像大小,也就是你要预览多大的图像,按照你说的图像应该是640*480的VGA。 3.最后,也是最重要的一点就是你如何把你采集到图像显示到LCD上的。如果是直接把图像考到lcd的buffer上的话是有一个公式的,并不是考到上面就行。这个公式如果弄错就会出现2个图像。 这个情况我也遇到过,不用急,很快就会挑好的   详情 回复 发表于 2009-8-2 19:15
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
会不会是VGA下是两个显存??
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
另外,能否知道你是如何得到vga_ptr指针的
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
你的图片是320*240,而framebuffer是640*480,如果按像素写应该不对。
你可以把图片居中写入试试
或者把图片放大两倍显示,最简单就是4个framebuffer的点对应图片一个点
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个问题我碰到过

1.首先你要了解你的摄像头输出地源图像是多少,也就是从摄像头你能得到多大的图像,这个一般在头文件里有设置。 如,你的摄像头输出640*480的 那么设置如下

#define CAM_SRC_HSIZE                                        (640)
#define CAM_SRC_VSIZE                                        (480)

这只是个例子,你的源图片文件名称也许不是这样。如果你的摄像头是130万像素,也就是可以支持1280*1024的话 源图像也有可能是这个 ,你要好好查查。

2.其次,要确定你要预览的图像大小,也就是你要预览多大的图像,按照你说的图像应该是640*480的VGA。

3.最后,也是最重要的一点就是你如何把你采集到图像显示到LCD上的。如果是直接把图像考到lcd的buffer上的话是有一个公式的,并不是考到上面就行。这个公式如果弄错就会出现2个图像。

这个情况我也遇到过,不用急,很快就会挑好的

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表