一个基于开源C++界面库SOUI,D3D,OpenCV的看图小程序。没什么新知识,一时兴起写的。
1.按照图片大小设置顶点缓存的坐标
前些时间思路错了,一直想通过D3D的坐标变换来实现纹理的宽高比例与原图一致,想破了脑袋也没有实现。没想到今天修改一下定点缓存坐标,把顶点坐标按照图片的宽高比例设置一下,没几分钟就实现了。
float wh_rate = (float)Height / (float)Width ; float y_cor = 20 * wh_rate ; hr = Device->CreateVertexBuffer( 4 * sizeof(MultiTexVertex), D3DUSAGE_WRITEONLY, MultiTexVertex::FVF, D3DPOOL_MANAGED, &QuadVB, 0); MultiTexVertex* v = 0; QuadVB->Lock(0, 0, (void**)&v, 0); v[0] = MultiTexVertex(-20.0f, y_cor, 0.0f, 0.0f, 0.0f); v[1] = MultiTexVertex( 20.0f, y_cor, 0.0f, 1.0f, 0.0f); v[2] = MultiTexVertex( 20.0f, -y_cor, 0.0f, 1.0f, 1.0f); v[3] = MultiTexVertex(-20.0f, -y_cor, 0.0f, 0.0f, 1.0f); QuadVB->Unlock(); RECT rc ; GetClientRect(hwnd,&rc) ; float v_z = (float)rc.right / (float)rc.bottom ; D3DXMATRIX P; D3DXMatrixPerspectiveFovLH(&P, D3DX_PI * 0.5f, v_z, 1.0f, //近裁减面到坐标原点的距离 1000.0f //远裁减面到原点的距离 ); Device->SetTransform(D3DTS_PROJECTION, &P); Device->SetRenderState(D3DRS_LIGHTING, false);
之前定点缓存的X,Y都是20,现在设置成与图片比例相同,同时把投影变换的横纵比修改为窗口的横纵比。试了几张图片,基本没问题。
2.程序使用截图
(1)启动
(2)点击打开按钮
(3)查看图片
(4)拖动图片
(5)鼠标滑轮缩放图片
基本上实现了一个看图软件的基本功能。图片支持的范围就是OpenCV的图片支持范围,常用的格式基本上都能看。体验上稍差。