Форум: "Начинающим";
Текущий архив: 2011.07.10;
Скачать: [xml.tar.bz2];
ВнизCopyRect Найти похожие ветки
← →
nataly (2011-03-29 15:12) [0]Добрый день. Можно ли из одного битмапа перекопировать не стандартную фигуру заданную формулой либо списком точек(х,y) соединенными линиями?
Единственное что нашла для этой цели - это функция CopyRect, но она копирует только прямоугольник, а вот овалы, круги, не стандартные фигуры чем можно?
← →
Игорь Шевченко © (2011-03-29 15:22) [1]Куда и для чего перекопировать ?
Возможно достаточно SelectClipRgn
← →
KilkennyCat © (2011-03-29 15:29) [2]
> достаточно SelectClipRgn
с CreatePolygonRgn
← →
KilkennyCat © (2011-03-29 15:31) [3]или (если несколько кусков одновременно хочется):
The CreatePolyPolygonRgn function creates a region consisting of a series of polygons. The polygons can overlap.
← →
aka (2011-03-29 15:33) [4]Часть задачи это, а если более конкретно - курсовая
Нужно будет почитать не много справку, вот если можно в MyRgn "впихнут" полигон из любого числа точек, как в кусочке кода из справки, то этого будет более чем достаточно.
MyRgn := CreateRectRgn(100,100,200,200);
SelectClipRgn(Image1.Canvas.Handle,MyRgn);
← →
aka-nataly (2011-03-29 16:37) [5]Подскажите пожалуйста что не правильно, почему часть одной картинки не копируется в новый пустой Image2 ??
var
rgn: HRGN;
pts: array of TPoint;
begin
SetLength(pts, 4);
pts[0]:=Point(0, 0);
pts[1]:=Point(10, 0);
pts[2]:=Point(10, 10);
pts[3]:=Point(0, 10);
rgn := CreatePolygonRgn(pts, 4, ALTERNATE);
SelectClipRgn(Image1.Canvas.Handle,rgn);
Image2.Canvas.FillRect(Image1.Canvas.ClipRect);
Image2.Invalidate;
DeleteObject(rgn);
← →
Игорь Шевченко © (2011-03-29 17:02) [6]
> не копируется
потому что CopyRect надо
← →
aka-nataly (2011-03-29 17:09) [7]
> потому что CopyRect надо
так ведь CopyRect копирует именно прямоугольник, даже два параметра имеет типа TRect
← →
Игорь Шевченко © (2011-03-29 17:40) [8]
> так ведь CopyRect копирует именно прямоугольник, даже два
> параметра имеет типа TRect
то, куда оно копирует, ограничено ClipRgn-ом
← →
aka-nataly (2011-03-29 17:49) [9]Image2.Canvas.CopyRect(Image1.Canvas.ClipRect, Image1.Canvas,Image1.Canvas.ClipRect);
не понятно хоть убейте, а дайте пример?
← →
KilkennyCat © (2011-03-29 18:16) [10]
> CreatePolygonRgn(pts, 4, ALTERNATE);
это не верно.
для динамического массива нужно указывать первый элемент массива,
т.е. CreatePolygonRgn(pts[0], 4, ALTERNATE);
← →
Игорь Шевченко © (2011-03-29 18:41) [11]
> хоть убейте, а дайте пример?unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
ComboBox1: TComboBox;
Label1: TLabel;
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
FSrcBitmap: TBitmap;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Invalidate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FSrcBitmap := TBitmap.Create;
FSrcBitmap.Height := PaintBox1.Height;
FSrcBitmap.Width := PaintBox1.Width;
FSrcBitmap.Canvas.Brush.Color := clRed;
FSrcBitmap.Canvas.FillRect(Rect(0, 0, FSrcBitmap.Width, FSrcBitmap.Height));
end;
procedure TForm1.FormPaint(Sender: TObject);
var
Rgn: HRGN;
ARect, RRect: TRect;
APoints: array of TPoint;
begin
PaintBox1.Canvas.Brush.Color := clBlack;
PaintBox1.Canvas.FrameRect(PaintBox1.ClientRect);
ARect := PaintBox1.ClientRect;
InflateRect(ARect, -1, -1);
case ComboBox1.ItemIndex of
0:
; //Do nothing
1:
begin
RRect := ARect;
InflateRect(RRect, -20, -20);
OffsetRect(RRect, PaintBox1.Left, PaintBox1.Top);
Rgn := CreateRoundRectRgn (RRect.Left, RRect.Top, RRect.Right, RRect.Bottom,
PaintBox1.Width, PaintBox1.Height);
SelectClipRgn(PaintBox1.Canvas.Handle, Rgn);
DeleteObject(Rgn);
end;
2:
begin
RRect := ARect;
InflateRect(RRect, -20, -20);
OffsetRect(RRect, PaintBox1.Left, PaintBox1.Top);
Setlength(APoints, 3);
APoints[0] := Point(RRect.Left, RRect.Top);
APoints[1] := Point(RRect.Right, RRect.Top);
APoints[2] := Point(RRect.Right, RRect.Bottom);
Rgn := CreatePolygonRgn(APoints[0], 3, WINDING);
SelectClipRgn(PaintBox1.Canvas.Handle, Rgn);
DeleteObject(Rgn);
end;
end;
PaintBox1.Canvas.CopyRect(ARect, FSrcBitmap.Canvas,
Rect(0, 0, FSrcBitmap.Width, FSrcBitmap.Height));
end;
end.object Form1: TForm1
Left = 0
Top = 0
Caption = "Form1"
ClientHeight = 293
ClientWidth = 574
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "Tahoma"
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnPaint = FormPaint
PixelsPerInch = 96
TextHeight = 13
object PaintBox1: TPaintBox
Left = 48
Top = 36
Width = 301
Height = 197
end
object Label1: TLabel
Left = 372
Top = 36
Width = 62
Height = 13
Caption = "Clipping type"
end
object ComboBox1: TComboBox
Left = 371
Top = 56
Width = 145
Height = 21
Style = csDropDownList
ItemIndex = 0
TabOrder = 0
Text = "No clipping"
OnChange = ComboBox1Change
Items.Strings = (
"No clipping"
"Round rect"
"Triangle")
end
end
← →
antonn © (2011-03-30 00:48) [12]Я бы использовал буферный битмап, на нем нарисовал маску и по ней попиксельно перенес изображение :) памяти наверное больше используется...
← →
Германн © (2011-03-30 02:38) [13]
> antonn © (30.03.11 00:48) [12]
>
> Я бы использовал буферный битмап, на нем нарисовал маску
> и по ней попиксельно перенес изображение
Ты код давай. Вот даже ИШ код дал!
:)
← →
MonoLife © (2011-03-30 07:20) [14]
> Единственное что нашла для этой цели - это функция CopyRect,
у "канвас" есть способ копирования SRCPAINT
Canvas.CopyMode:=SRCPAINT
← →
han_malign (2011-03-30 09:26) [15]
> на нем нарисовал маску и по ней попиксельно перенес изображение
- это одним BitBlt делается, если маску как кисть использовать...
ROP = $00AC0744 ( SPDSxax = S^(P&(D^S)) - то есть маска должна быть инверсная)
Либо вульгарный MaskBlt...
← →
Anatoly Podgoretsky © (2011-03-30 10:05) [16]> Германн (30.03.2011 02:38:13) [13]
А это авторитет :-)
← →
antonn © (2011-03-30 15:17) [17]
> Ты код давай. Вот даже ИШ код дал!
> :)
зачем, вон уже Игорь дал! :)
> - это одним BitBlt делается, если маску как кисть использовать.
> ..
> ROP = $00AC0744 ( SPDSxax = S^(P&(D^S)) - то есть маска
> должна быть инверсная)
и легким допилом я могу делать маску в "grayscale" и рисовать с альфаблендом
← →
Игорь Шевченко © (2011-03-30 16:34) [18]
> зачем, вон уже Игорь дал! :)
теперь жалею :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.07.10;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c