Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1301471734
Matveih1
2011-03-30 11:55
2011.07.10
PopupMenu и свой компонент


15-1301002199
Юрий
2011-03-25 00:29
2011.07.10
С днем рождения ! 25 марта 2011 пятница


2-1301495507
harisma
2011-03-30 18:31
2011.07.10
TAnimate в Windows 7


1-1259091900
Misterix
2009-11-24 22:45
2011.07.10
Перетащить картинку с рабочего стола на TImage


15-1300719280
mahab-22
2011-03-21 17:54
2011.07.10
работа с dbexpress





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский