Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.07.10;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
2-1301559093
Matveih1
2011-03-31 12:11
2011.07.10
DBGridEh и AutoFitColWidths


11-1234115025
Lexi
2009-02-08 20:43
2011.07.10
Где можно взять KOLMHToolTip.pas?


2-1301895517
Палыч
2011-04-04 09:38
2011.07.10
Chart


10-1175061542
ustas
2007-03-28 09:59
2011.07.10
InternetExplorer.Application link Click


15-1301344197
Юрий
2011-03-29 00:29
2011.07.10
С днем рождения ! 29 марта 2011 вторник