2010-07-21 4 views
1

Может ли кто-нибудь поделиться образцом кода, чтобы нарисовать непрямоугольную часть изображения в холсте delphi?Рисование не прямоугольной части изображения в холсте delphi

+0

Возможно ответ Mghie здесь полезен? http://stackoverflow.com/questions/1728141/tbitmap-drawing-transparent-image-in-delphi-2009 –

+0

не связано фактически – Maysam

ответ

2

Вы ищете пути GDI. Запустите here, в котором объясняется, какие пути находятся в этом контексте, и содержит ссылки слева, чтобы объяснить функциональность, доступную с ними.

В Google может появиться множество примеров использования путей в Delphi. Если вы не можете найти их, напишите комментарий здесь, и я посмотрю, что я могу вам помочь.

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

как мы можем вырезать картинку с любой формой, вы не отвечаете на любую часть этого вопроса – Maysam

2

Ваш вопрос довольно расплывчатый. Но я подозреваю, что вы ищете отсечения регионов. Прочитайте их. Установите область отсечения на целевом устройстве в нужную вам форму и затем нарисуйте изображение на устройстве. Будет нарисована только часть изображения, которое будет находиться в области отсечения.

+0

как я могу это сделать в delphi? – Maysam

+0

Ознакомьтесь с областью и функциями отсечения Windows GDI, такими как CreatePolygonRGN() и SelectClipRgn(). В Интернете должно быть множество примеров использования регионов для вывода результатов. Его действительно довольно просто - вы определяете область на целевом DC, которую хотите ограничить рисованием, выполнить свой рисунок (изображения, линии и т. Д.), А затем вернуть область отсечения в нормальное состояние. Вот простой пример в библиотеке MSDN: http://msdn.microsoft.com/en-us/library/dd183437(v=VS.85).aspx – GrandmasterB

0

Я использую так называемые runlists для этой функции (обобщенные фигуры и blitting их). Я видел, как они тоже назывались warplists. Форма кодируется как список, определяя ее как набор горизонтальных линий, а каждая строка представляет собой два целочисленных значения (пропускать n пикселей, копировать n пикселей).

Это означает, что вы можете нарисовать целые линии, оставив при этом только операции рисования по высоте.

Так определен прямоугольник (первые «пропускающие» пиксели от верхнего уровня к левому углу (xorg, yorg). Прямоугольник шириной шириной шириной, а 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), 
.. 
.. 

Таким образом, вы можете сделать свой рисунок процедуру довольно общими, так и для простых, обычных форм (прямоугольников, кружки) она занимает лишь небольшую математику предвычислять эти списки. Это упрощенные мою форму

Однако я рисую непосредственно на растровые изображения, а не на холсты, поэтому я не могу помочь с этой частью. Примитив, который эффективно рисует строку, и способ извлечь строку из графика должен быть достаточным.

Смежные вопросы