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

king114477   2009-8-1 18:48 楼主
各位大佬

有段代码我用在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尺寸下,图像很正常。请教各位大佬。

回复评论 (4)

会不会是VGA下是两个显存??
点赞  2009-8-2 11:20
另外,能否知道你是如何得到vga_ptr指针的
点赞  2009-8-2 11:26
你的图片是320*240,而framebuffer是640*480,如果按像素写应该不对。
你可以把图片居中写入试试
或者把图片放大两倍显示,最简单就是4个framebuffer的点对应图片一个点
点赞  2009-8-2 14:14
这个问题我碰到过

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
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复