如何使用GDI将方形位图渲染为任意四边形多边形?

Dav*_*vid 15 delphi graphics gdi+ gdi transform

我需要绘制一个正方形图像,映射或转换为未知的编译时四边形多边形.我怎样才能做到这一点?

更长的解释

具体问题是渲染具有非矩形地图投影的地图图块.假设我有以下磁贴:

方形瓷砖

我知道需要有四个角点:

四个扭曲的角落

鉴于此,我想得到以下输出:

扭曲的图像映射多边形

方形瓷砖可能是:

  • 旋转; 和/或
  • 一端比另一端窄.

认为第二项意味着这需要非仿射变换.

随机附加说明

四面?完全正确的情况是合理的,瓷砖应该映射到具有四个以上点的多边形,但是对于我们的目的和绘制的尺度,方形 - >其他四角多边形变换应该足够了.

为什么只有GDI? 到目前为止,所有渲染都是使用GDI完成的,我希望快速保持代码(a),并且(b)需要尽可能少的额外库.我知道有一些对GDI转换的支持,并且今天一直在试验它们,但即使在试验它们之后,我也不确定它们是否足够灵活用于此目的.如果他们是,我还没有设法弄清楚,所以我真的很感激一些示例代码.

GDI +也可以,因为我们在其他地方使用它,但我知道它可能很慢,速度在这里很重要.

另一种选择是Delphi - / C++ Builder特有的; 这个程序主要是用C++编写的,使用的是VCL,所讨论的图形目前被绘制成TCanvas,混合使用TCanvas方法和原始WinAPI/GDI调用.

叠加图像:最后一点需要注意的是,图块中的一种颜色可能是用于颜色键的透明度:也就是说,上面图块中的所有白色(说)方块在绘制在下面的任何内容时应该是透明的.目前,使用TransparentBlt将切片绘制到方形或轴对齐的矩形目标.

对于让这个问题比"我应该使用什么算法?"更复杂的所有额外警告我感到抱歉.但我也很乐意接受只有算法信息的答案.

kob*_*bik 6

看看3D Lab Vector图形.(演示中特别是"足球场").


另一个很酷的资源是包含完整源代码的AggPas(下载)

AggPas是开源和免费的2D矢量图形库.它是Anti-Grain Geometry库的一个Object Pascal原生端口 - AGG,最初由Maxim Shemanarev在C++中编写.AggPas不依赖于任何图形API或技术.基本上,您可以将AggPas视为渲染引擎,该引擎从某些矢量数据在内存中生成像素图像.

以下是perspective演示的样子:

在此输入图像描述

改造后:

在此输入图像描述


iam*_*osy 6

您可能还想查看Graphics32.屏幕截图bewlow显示了GR32中transfrom演示的样子


use*_*321 5

George Wolberg的"数字图像变形"中描述了一般技术.看起来这个摘要包含了相关的数学,本文也是如此.您需要创建一个从一个四边形映射到另一个四边形的透视矩阵.以上链接显示了如何创建矩阵.获得矩阵后,您可以扫描输出缓冲区,执行转换(或者可能是反转 - 取决于它们给您的转换),这将为您提供可以从中复制的原始图像中的点.

使用OpenGL在4个点之间绘制纹理四边形可能更容易,但这并不像您想要的那样使用GDI.