image-processing - 使用 Direct2D 的大图像

标签 image-processing graphics windows-8 windows-store-apps direct2d

目前我正在为使用 Direct2D 进行实时图像处理的 Windows 应用商店开发应用程序。它必须支持各种尺寸的图像。我面临的第一个问题是如何处理图像大于支持的最大纹理尺寸的情况。经过一些研究和文档阅读后,我找到了 VirtualSurfaceImageSource 作为解决方案。这个想法是将图像作为 IWICBitmap 加载,然后使用 CreateWICBitmapRenderTarget (据我所知不是硬件加速)创建渲染目标。在一些绘图操作之后,我想通过使 VirtualSurfaceImage 源中的相应区域无效或在 NeedUpdate 回调触发时将结果显示到屏幕上。我认为可以通过创建 ID2D1Bitmap(硬件加速)并使用 CreateWICBitmapRenderTarget 创建的渲染目标和无效区域作为边界调用 CopyFromRenderTarget 来实现,但该方法返回 D2DERR_WRONG_RESOURCE_DOMAIN 结果。使用 IWICBitmap 的另一个原因是应用程序中涉及的算法之一,必须有权访问更新图像的像素。

问题是为什么这个逻辑不起作用?这是使用 Direct2D 实现我的目标的正确方法吗?此外,如果我想在 GPU 上使用大于最大允许纹理大小的图像进行图像处理,那么使用 CreateWICBitmapRenderTarget 创建的渲染目标不是硬件加速的,这是最佳解决方案吗?

先感谢您。

最佳答案

您是正确的,必须在软件中处理大于纹理限制的图像。

但是,要问的问题是每次渲染时是否都需要整个图像。

您可以使用硬件加速来渲染加载到软件目标中的大图像的一部分。

例如,

  • 使用ID2D1RenderTarget::CreateSharedBitmap使可以通过不同的资源使用的位图。
  • 然后创建一个 ID2D1BitmapRenderTarget 并将大位图渲染到其中。 (确保执行 BeginDraw、Clear、DrawBitmap、EndDraw)。位图和渲染目标都可以缓存以供连续调用使用。
  • 然后使用 ID2D1Bitmap::CopyFromRenderTarget 方法从该渲染目标复制到常规 ID2D1Bitmap 中,该部分将适合纹理内存。
  • 最后将其绘制到真正的渲染目标,pRT->DrawBitmap
  • 关于image-processing - 使用 Direct2D 的大图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16337760/

    相关文章:

    image - Google 图像如何标准化每行的宽度?

    java - 如何将值传递给构造函数并从同一类中的方法使用它?

    windows-8 - 是否有用于Intel Core 2 Duo CPU的仿真软件或EPT(SLAT)补丁?

    printing - 如何在 Windows 8 中打印 xps 文件

    android - 如何在 Windows 8 上调试 Samsung Galaxy S Advanced 上的 Android 应用程序?

    opencv - 使用 OpenCV 对小而嘈杂的图像进行特征检测

    matlab - 如何从图像中删除/替换边框像素?

    image - 正确理解不正确的MATLAB运算

    java - 仅使用 API 将灰度图像绘制到另一个 BufferedImage 的 alpha 带

    algorithm - 从矩形绘制椭圆