2010-07-21 64 views
1

任何人都可以共享一个示例代码在delphi画布中画一个非矩形部分的图片吗?在delphi画布中画一个非矩形部分的图片

+0

也许Mghie在这里的答案有帮助吗? http://stackoverflow.com/questions/1728141/tbitmap-drawing-transparent-image-in-delphi-2009 – 2010-07-21 20:21:01

+0

实际上并不相关 – Maysam 2010-07-22 03:04:57

回答

2

您正在寻找GDI路径。开始here,它解释了在这种情况下的路径,并在左侧提供了链接来解释可用的功能。

谷歌可以举出很多在Delphi中使用路径的例子。如果你找不到它们,请在这里发表评论,我会看到我能为你提供什么。

1
Canvas.Ellipse(0, 0, 10, 20); // not a rectangle 
+0

我们怎样才能以任何形状剪切图片,你没有回答这个问题的任何部分 – Maysam 2010-07-22 01:36:54

2

你的问题很模糊。但我怀疑你正在寻找的是裁剪区域。阅读它们。将目标设备上的剪切区域设置为所需的形状,然后将图像绘制到设备上。只有在裁剪区域内的图像部分才会被绘制。

+0

如何在delphi中做到这一点? – Maysam 2010-07-22 01:35:50

+0

阅读Windows GDI的区域和剪切函数,例如CreatePolygonRGN()和SelectClipRgn()。在线使用区域剪辑输出应该有充足的例子。它非常简单 - 您在目标DC上定义一个要限制绘制的区域,执行绘图(图像,线条等),然后将裁剪区域重置为正常。以下是MSDN库中的一个简单示例:http://msdn.microsoft.com/zh-cn/library/dd183437(v=VS.85).aspx – GrandmasterB 2010-07-22 19:33:52

0

我使用所谓的运行列表为此功能(广义形状和blitting它们)。我也看到他们也叫warplists。通过将形状定义为一组水平线来将形状编码为运行列表,并且每行是两个整数值(跳过n个像素,复制n个像素)。

这意味着您可以绘制整条线,只留下“高度”绘制操作。因此,定义了一个矩形(第一个从顶级角到左角(“xorg”,“yorg”)的“跳过”像素,该矩形为width_rect宽,width_pixels为更进一步的线,width_pixels可以宽于宽度图片(排列字节)

(yorg*width_pixels+xorg , width_rect), 
(width_pixels-width_rect , width_rect), 
(width_pixels-width_rect , width_rect), 
(width_pixels-width_rect , width_rect), 
.. 
.. 

这种方式可以让你的描绘过程相当通用的,简单的,规则形状(rects,圆圈)只需要轻微的数学预先计算这些列表。它简化了我的形状处理很大

但是我直接绘制位图,而不是画布,所以我无法帮助那部分。有效地绘制一行的原语以及从图形中提取一行的方法应该就足够了。