通过DirectX更快地显示大型图像?

3
作为工业视觉应用程序的开发者,我经常处理一些比较笨重的图像,比如6000x4000像素及以上大小的图像。
虽然相机和图像处理正在处理一系列新图像(这也是主要任务),但我希望允许用户同时舒适地查看其他图像。
在处理器上(如GDI等)进行此操作会太过费时。例如,我们分析图像需要0.2秒,但仅仅是将其显示出来并进行单个缩放(调整到某个控件的大小)就需要0.8秒,更不用说让用户继续移动和深入了解图像了。
由于Photoshop可以利用显卡的非常快速的内存和处理来显示和缩放,所以我想知道是否有人能给我一个想法,即如何在我的代码中尝试这个功能:将数据推送到显卡(对于我的76MB的RGB数据需要多长时间?)并在某个控件中显示它,使用户可以轻松缩放和移动。
无需3D效果,只需要在2D RGB图像中移动和调整大小。目标是实现低处理器负载下快速舒适地查看。
==> 是否可能(作为纹理或类似物)? ==> 当前256MB以上的低端3D卡有哪些限制? ==> 有人能建议一些预期持续时间(复制数据、缩放)吗?
4个回答

2

您将受到最大纹理大小的限制(因卡而异),因此您需要将大图像细分为几个较小的纹理。只要显卡是AGP或PCI-E,将实际的纹理数据传输到视频内存应该非常快。


1
什么是像素格式?你的尺寸数字似乎适用于8位RGB,一个6000x4000像素的单个图像应该需要大约69 MB的空间。因此,它应该适合低端显卡的纹理内存,假设Windows和其他应用程序没有太多开销。当然,将其上传到图形卡的内存需要一段时间;很难提供一个估计,因为它很可能会随着系统负载和硬件/总线配置而变化。
我更担心的是纹理尺寸的最大限制。我认为今天的高端显卡在纹理中最大只能达到4096x4096个像素,这意味着你无法将图像放入单个纹理中。
设置DirectX来测试这个不应该太难,有很多教程可以参考。这里是一个快速链接,展示了如何使用纹理进行渲染;查看同一教程系列的前几部分,以了解如何初始化相关内容。

图像以8位灰度的R、G和B三个单平面的形式可用。以其他方式混合它不会成为问题。所以内存适应内存,但不能放在一个纹理上?将两个平面并排放置是一个选择吗?还是会带来伪影?感谢链接和想法! - claus
将一个或多个平面放在一起,细分图像数据以匹配是显而易见的解决方案。应该可以设置纹理过滤模式来避免伪影。如果这篇文章帮助了您,欢迎点赞。 :) - unwind

0

您可以使用Direct3D来完成此操作。通过绘制纹理四边形,它可以轻松处理大型图像的平移和缩放。

由于您的图像大小和屏幕大小(您没有6Kx4K显示器,对吧?),因此您需要创建一个系统,按需将大型图像分页到纹理中。鉴于输入数据的大小,我认为您会发现在将东西传输到卡之间,I/O带宽是影响速度的主要因素。您可能会发现,值得创建一种存储图像的方式,以利用二维空间上的空间相干性(即瓦片式存储布局,而不是扫描线式存储布局),并计算点采样的低分辨率版本。您可以使用未压缩的RGB自行完成所有这些操作,无需使用JPEG2000。他们选择图像后,您可以将此数据存储为低优先级后台进程。首先尽快将屏幕上可见的内容传输到卡中,然后开始重新组织它以实现更快的流式传输/缩放。


0
我建议您使用专门为此类任务设计的格式。它是JPEG2000。您想要的功能称为ROI(感兴趣区域)和渐进式传输。如果需要,它可以无损。

谢谢您的建议,但将数据编码为JPEG2000需要整整五秒钟的时间。这不是一个可行的选择,因为它需要太多的时间和处理器负载。 - claus
你不能将那些数据存储或缓存为JPEG2000格式吗? - vartec
顺便提一句,你可以通过GPU加速它。例如,请参阅http://www.cse.cuhk.edu.hk/~ttwong/software/dwtgpu/dwtgpu.html。 - vartec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接