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

时间:2012-03-07 20:31:35

标签: delphi graphics gdi+ transform gdi

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

更长的解释

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

Square tile

我知道需要有四个角点:

Four distorted corners

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

Distorted, image-mapped polygon

方形图块可能是:

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

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

  

随机附加说明

     

四面?要完全正确,瓷砖应该是合理的   映射到具有四个以上点的多边形,但出于我们的目的   并且在绘制的比例尺上,正方形 - >其他四角多边形   改造应该足够了。

     

为什么只选择GDI?到目前为止,所有渲染都是使用GDI完成的,我希望快速保持代码(a),并且(b)需要额外的少量   图书馆尽可能。我知道some support for transformations in GDI并且一直在试验它们   今天,但即使在尝试过它们之后,我也不确定它们是否存在   为此目的足够灵活。如果他们是,我没有成功   搞清楚,所以我真的很感激一些示例代码。

     

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

     

另一种选择是Delphi - /   C++Builder - 特异性的;这个程序主要是用C ++编写的   VCL和有问题的图形目前都被绘制成了一个   TCanvas混合了TCanvas methods和原始WinAPI / GDI调用。

     

覆盖图像:最后一点需要注意的是,瓷砖中的一种颜色可能用于颜色键   透明度:即上面瓷砖中的所有白色(说)方块   在绘制在下面的任何东西时应该是透明的。   目前,瓷砖被绘制成方形或轴对齐的矩形   目标使用TransparentBlt

     

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

3 个答案:

答案 0 :(得分:6)

看看3D Lab Vector graphics。 (演示中特别是“足球场”)。


另一个很酷的资源是AggPas,其中包含完整的来源(download

  

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

以下是perspective演示的样子:

enter image description here

转型后:

enter image description here

答案 1 :(得分:6)

您可能还想查看Graphics32。 下面的屏幕截图显示了GR32中的转换演示如何看起来像

答案 2 :(得分:5)

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

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