![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CopyRect [D7]
nataly © (2011-03-29 15:12:00)Добрый день. Можно ли из одного битмапа перекопировать не стандартную фигуру заданную формулой либо списком точек(х,y) соединенными линиями?
Единственное что нашла для этой цели - это функция CopyRect, но она копирует только прямоугольник, а вот овалы, круги, не стандартные фигуры чем можно?
Игорь Шевченко (2011-03-30 16:34:00) [1]
> зачем, вон уже Игорь дал! :)
теперь жалею :)
antonn (2011-03-30 15:17:00) [2]
> Ты код давай. Вот даже ИШ код дал!
> :)
зачем, вон уже Игорь дал! :)
> - это одним BitBlt делается, если маску как кисть использовать.
> ..
> ROP = $00AC0744 ( SPDSxax = S^(P&(D^S)) - то есть маска
> должна быть инверсная)
и легким допилом я могу делать маску в "grayscale" и рисовать с альфаблендом
Anatoly Podgoretsky (2011-03-30 10:05:00) [3]> Германн (30.03.2011 02:38:13) [13]
А это авторитет :-)
han_malign (2011-03-30 09:26:00) [4]
> на нем нарисовал маску и по ней попиксельно перенес изображение
- это одним BitBlt делается, если маску как кисть использовать...
ROP = $00AC0744 ( SPDSxax = S^(P&(D^S)) - то есть маска должна быть инверсная)
Либо вульгарный MaskBlt...
MonoLife (2011-03-30 07:20:00) [5]
> Единственное что нашла для этой цели - это функция CopyRect,
у "канвас" есть способ копирования SRCPAINT
Canvas.CopyMode:=SRCPAINT
Германн (2011-03-30 02:38:00) [6]
> antonn © (30.03.11 00:48) [12]
>
> Я бы использовал буферный битмап, на нем нарисовал маску
> и по ней попиксельно перенес изображение
Ты код давай. Вот даже ИШ код дал!
:)
antonn (2011-03-30 00:48:00) [7]Я бы использовал буферный битмап, на нем нарисовал маску и по ней попиксельно перенес изображение :) памяти наверное больше используется...
Игорь Шевченко (2011-03-29 18:41:00) [8]
> хоть убейте, а дайте пример?
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
KilkennyCat (2011-03-29 18:16:00) [9]
> CreatePolygonRgn(pts, 4, ALTERNATE);
это не верно.
для динамического массива нужно указывать первый элемент массива,
т.е. CreatePolygonRgn(pts[0], 4, ALTERNATE);
aka-nataly (2011-03-29 17:49:00) [10]Image2.Canvas.CopyRect(Image1.Canvas.ClipRect, Image1.Canvas,Image1.Canvas.ClipRect);
не понятно хоть убейте, а дайте пример?
Игорь Шевченко (2011-03-29 17:40:00) [11]
> так ведь CopyRect копирует именно прямоугольник, даже два
> параметра имеет типа TRect
то, куда оно копирует, ограничено ClipRgn-ом
aka-nataly (2011-03-29 17:09:00) [12]
> потому что CopyRect надо
так ведь CopyRect копирует именно прямоугольник, даже два параметра имеет типа TRect
Игорь Шевченко (2011-03-29 17:02:00) [13]
> не копируется
потому что CopyRect надо
aka-nataly (2011-03-29 16:37:00) [14]Подскажите пожалуйста что не правильно, почему часть одной картинки не копируется в новый пустой 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);
aka (2011-03-29 15:33:00) [15]Часть задачи это, а если более конкретно - курсовая
Нужно будет почитать не много справку, вот если можно в MyRgn "впихнут" полигон из любого числа точек, как в кусочке кода из справки, то этого будет более чем достаточно.
MyRgn := CreateRectRgn(100,100,200,200);
SelectClipRgn(Image1.Canvas.Handle,MyRgn);
KilkennyCat (2011-03-29 15:31:00) [16]или (если несколько кусков одновременно хочется):
The CreatePolyPolygonRgnfunction creates a region consisting of a series of polygons. The polygons can overlap.
KilkennyCat (2011-03-29 15:29:00) [17]
> достаточно SelectClipRgn
с CreatePolygonRgn
Игорь Шевченко (2011-03-29 15:22:00) [18]Куда и для чего перекопировать ?
Возможно достаточно SelectClipRgn