2010-07-21 108 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,圓圈)只需要輕微的數學預先計算這些列表。它簡化了我的形狀處理很大

但是我直接繪製位圖,而不是畫布,所以我無法幫助那部分。有效地繪製一行的原語以及從圖形中提取一行的方法應該就足夠了。