美文网首页
缩放DXGI捕抓的屏幕画面

缩放DXGI捕抓的屏幕画面

作者: 叶迎宪 | 来源:发表于2022-11-17 22:22 被阅读0次

https://stackoverflow.com/questions/24064837/resizing-a-dxgi-resource-or-texture2d-in-sharpdx

准备采用Direct2D的方案,因为它灵活性更好,可以缩放任意比例。但是答案只是给了个大概,并没有实现的细节。在模仿实现的时候,遇到的问题:

一、ID2D1DeviceContext::EndDraw()报错
0x88990024 : 无法将图像设置为目标,原因是它是一种效果或是未设置 D2D1_BITMAP_OPTIONS_TARGET 标志的位图。
意思是 ID2D1DeviceContext::SetTarget 中传入的ID2D1Bitmap1,没有D2D1_BITMAP_OPTIONS_TARGET 标志。而ID2D1Bitmap1,是通过 CreateBitmapFromDxgiSurface 从 ID3D11Texture2D 创建的。这款 ID3D11Texture2D 创建时的属性为

    // Create CPU access texture
    desc.Width = output_dup_desc_.ModeDesc.Width;
    desc.Height = output_dup_desc_.ModeDesc.Height;
    desc.Format = output_dup_desc_.ModeDesc.Format;
    desc.ArraySize = 1;
    desc.BindFlags = 0;
    desc.MiscFlags = 0;
    desc.SampleDesc.Count = 1;
    desc.SampleDesc.Quality = 0;
    desc.MipLevels = 1;
    desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
    desc.Usage = D3D11_USAGE_STAGING;
    hr = d3d11_dev_->CreateTexture2D(&desc, NULL, &dest_image_);

这片纹理是需要从gpu读回cpu的,需要支持 ID3D11DeviceContext::Map 操作。因此 Usage 需要设置为D3D11_CPU_ACCESS_READ,BindFlags设置为空。从这片纹理创建出的ID2D1Bitmap1,无法设置 D2D1_BITMAP_OPTIONS_TARGET

解决办法:用于Direct2D绘制(即被SetTarget)的ID2D1Bitmap1,对应的那块 ID3D11Texture2D ,必须Usage = D3D11_USAGE_DEFAULT,BindFlags = D3D11_BIND_RENDER_TARGET

二、ID2D1DeviceContext::EndDraw()报错
0x88990021 : 无法使用带 D2D1_BITMAP_OPTIONS_CANNOT_DRAW 选项的位图进行绘制。
这个错误实际应该是 ID2D1DeviceContext::DrawBitmap 带来的。只是绘制的函数全部没有HResult返回,错误只能在EndDraw()里面报告了。传入DrawBitmap的源 ID2D1Bitmap1,对应的ID3D11Texture2D 创建属性为

    desc.Width = output_dup_desc_.ModeDesc.Width;
    desc.Height = output_dup_desc_.ModeDesc.Height;
    desc.Format = output_dup_desc_.ModeDesc.Format;
    desc.ArraySize = 1;
    desc.BindFlags = D3D11_BIND_FLAG::D3D11_BIND_RENDER_TARGET;
    desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;
    desc.SampleDesc.Count = 1;
    desc.SampleDesc.Quality = 0;
    desc.MipLevels = 1;
    desc.CPUAccessFlags = 0;
    desc.Usage = D3D11_USAGE_DEFAULT;
    hr = d3d11_dev_->CreateTexture2D(&desc, NULL, &gdi_image_);

这样的ID3D11Texture2D ,对应的bitmapOptions只能是 D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET。

解决办法:用于 DrawBitmap 的源ID2D1Bitmap1,对应的那块 ID3D11Texture2D,使用 BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE

参考资料
https://www.codeproject.com/Tips/1116253/Desktop-Screen-Capture-on-Windows-via-Windows-Desk
https://stackoverflow.com/questions/54400679/get-gdi-dc-from-id3d11texture2d-for-drawing
https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/Direct2D/devices-and-device-contexts.md
https://learn.microsoft.com/en-us/windows/win32/direct2d/how-to-draw-a-bitmap

相关文章

  • 缩放DXGI捕抓的屏幕画面

    https://stackoverflow.com/questions/24064837/resizing-a-d...

  • Zoomit快捷键

    屏幕缩放 Ctrl + 1 Ctrl + 1 : 屏幕缩放通过Ctrl + 1快捷键可以放大屏幕。此时屏幕默认放大...

  • DXGI捕获桌面

    DXGI与D3D关系 DXGI 为未来的图形组件提供了一个通用框架。DXGI 的目的是与内核模式驱动程序和系统硬件...

  • maike-ruler编辑器开发标尺工具

    工具效果如图 页面标尺工具,缩放跟随 支持屏幕像素 devicePixelRatio支持参考线支持屏幕缩放支持动态...

  • manjaro 屏幕缩放

    平时在公司里面写代码的时候总会遇到个问题就是下班后回宿舍,或者是回家后就写不了的情况哈,因为我一直使用着台式机,每...

  • 无法捕抓

    时间是什么? 没人会知道, 但是每个人都希望捕抓时间。 光阴似箭, 河水在流淌, 白云在飘荡, 青山在掠影, 可惜...

  • 围绕一个点的缩放问题

    假设的情形是缩放的时候,例如点击屏幕上的一个点进行缩放,缩放后的点相对于手指或者说屏幕的位置是不变的。 下面的例子...

  • css 图片随屏幕等比例缩放

    有时我们希望图片能随屏幕大小的缩放而缩放,两种情况: 单个图片缩放 图片在盒子内缩放 裸图片的缩放 图片在一个盒子...

  • Android 视频手势缩放与自动吸附动效实现

    1. 功能需求 双指缩放视频播放画面,支持设定最小、最大缩放范围 双指拖动画面可任意方向移动 如果是缩小画面,最后...

  • Android 音视频开发实战:视频手势缩放与自动吸附动效实现(

    1. 功能需求 双指缩放视频播放画面,支持设定最小、最大缩放范围 双指拖动画面可任意方向移动 如果是缩小画面,最后...

网友评论

      本文标题:缩放DXGI捕抓的屏幕画面

      本文链接:https://www.haomeiwen.com/subject/aeiexdtx.html