VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 231|回复: 1

[交流] D3D绘制图片 窗口缩放后图片模糊

[复制链接]
99_avatar_middle
最佳答案
1 
online_vip 发表于 2019-12-21 13:53:57 | 显示全部楼层 |阅读模式
  1. //--------------------------------  绘制图片的代码
  2. void DrawPicByFile(const char* picFileName, int x, int y, int w, int h) {
  3.   if (picFileName == NULL || w <= 0 || h <= 0) {
  4.    return;
  5.   }
  6.   IDirect3DTexture9* pPic = NULL;
  7.    if (FAILED(D3DXCreateTextureFromFileA(this->pD3DDevice, picFileName, &pPic))) {
  8.     return;
  9.    }

  10.   // 图片顶点数据, 实际上是以2个三角形组成的矩形
  11.   D3D_PIC_VERTEX vertexs[] = {
  12.    { (float)x, (float)y, 0.0f, 1.0f, 0.0f, 0.0f },
  13.    { (float)(x + w), (float)y, 0.0f, 1.0f, 1.0f, 0.0f },
  14.    { (float)(x + w), (float)(y + h), 0.0f, 1.0f, 1.0f, 1.0f },
  15.    { (float)x, (float)y, 0.0f, 1.0f, 0.0f, 0.0f },
  16.    { (float)(x + w), (float)(y + h), 0.0f, 1.0f, 1.0f, 1.0f },
  17.    { (float)x, (float)(y + h), 0.0f, 1.0f, 0.0f, 1.0f },
  18.   };
  19.   // 创建顶点缓冲区
  20.   LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
  21.   if (FAILED(this->pD3DDevice->CreateVertexBuffer(6 * sizeof(D3D_PIC_VERTEX), 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_DEFAULT, &g_pVB, NULL))) {
  22.    return;
  23.   }
  24.   // 填充顶点缓冲区
  25.   void* pVertexsBuf = NULL;
  26.   if (FAILED(g_pVB->Lock(0, sizeof(vertexs), (void**)&pVertexsBuf, 0))) {
  27.    g_pVB->Release();
  28.    return;
  29.   }
  30.   memcpy(pVertexsBuf, vertexs, sizeof(vertexs));
  31.   g_pVB->Unlock();
  32.   // 设置数据源()
  33.   this->pD3DDevice->SetStreamSource(0, g_pVB, 0, sizeof(D3D_PIC_VERTEX));
  34.   this->pD3DDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
  35.   this->pD3DDevice->SetTexture(0, pPic);
  36.   // 开启Alpha混合, 设置源混合因子和目标混合因子
  37.   this->pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  38.   this->pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
  39.   this->pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
  40.   // 绘制()
  41.   this->pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
  42.   g_pVB->Release();
  43. }


  44. //-------------------------------- 创建设备的代码
  45. D3DPRESENT_PARAMETERS d3dpp;      // D3D窗口显示信息结构
  46.   memset(&d3dpp, 0, sizeof(d3dpp));
  47.   d3dpp.Windowed = TRUE;        // 满屏显示
  48.   d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;   // 透明窗口需要用此后台缓存格式
  49.   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  50.   // 创建D3D设备对象, 用于向屏幕渲染图形(正在使用的显卡, 渲染方式, 窗口句柄, 设备的运行方式, D3DPRESENT_PARAMETERS结构指针, 返回D3D设备对象)
  51.   if (FAILED(this->pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &(this->pD3DDevice)))) {
  52.    this->Clean();
  53.    return FALSE;
  54.   }


  55. //-------------------------------- 绘制代码

  56. HWND hwnd = (HWND)param;
  57. CRect rect;
  58. GetClientRect(hwnd, &rect);
  59. while (1) {
  60.   gD3D.ClearScene(D3DCOLOR_ARGB(255, 0, 0, 0));   // 就是this->pD3DDevice->Clear()
  61.   gD3D.Start();                                                        // 就是this->pD3DDevice->BeginScene();

  62.   gD3D.DrawPicByFile("C:\\1.png", 0, 0, rect.Width(), rect.Height());

  63.   gD3D.End();                                                           // 就是this->pD3DDevice->EndScene()和Present(NULL, NULL, NULL, NULL)
  64. }
复制代码

源尺寸
D3D绘制图片 窗口缩放后图片模糊
拉伸后
D3D绘制图片 窗口缩放后图片模糊

就是窗口拉大以后, 图片变的很模糊(图片是截屏的,所以图片足够大了), 怎么修改代码才能让窗口缩放不影响图片




上一篇:求大佬帮忙
下一篇:调用cef封装成的mfc规则dll出现问题
51_avatar_middle
最佳答案
82 
online_admins 发表于 2019-12-21 23:42:51 | 显示全部楼层
这个最好使用双缓冲,先把原始图片比如是:1024x1024的大小原封不动的画到一个内存DC上,之后将这个内存DC用 StretchBlt 拉伸拷贝到窗口上,比如窗口的大小是:500x500,那么就调用 StretchBlt 缩放到这么大拷贝。如果窗口大小是 1000x1000,那么就调用 StretchBlt 缩放到 这个新的尺寸,所以这种情况下,如果图片足够大,肯定不会模糊的,楼主不妨试试
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-30 01:33

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表