Découper une image selon une figure prédéfinie

Résolu
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 12 déc. 2006 à 22:50
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 14 déc. 2006 à 17:55
bonjour à tous,

Vous prenez un bitmap que vous affichez dans un TImage ou TPaintBox..
Ensuite par programmation, par exemple, vous voulez découper proprement cette image selon une ellipse.
plus simplement dit comment faire un couper coller d'une image en forme d'une ellipse ?
je n'ai pas trouvé d'exemple sur ce thème..

Je sais cela ne présente guère d'intérêt.. car il y a des outils qui le font directement..

Mais..

cantador

8 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
13 déc. 2006 à 01:55
avec les regions tout simplement...

3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
13 déc. 2006 à 21:53
Salut,

il y a un petit souci dans le code que tu donnes :

- tu ne peux affecter une région que si c'est un descendant de TWinControl et TPaintBox descent de TGraphicControl !
-  Supprime le TPaintBox, ... Place un TPanel sur ta fiche donne lui la taille souhaité ... ajoute lui un TPaintBox avec Align à alClient et surtout ne pas oublier de réassigner l'évennement OnPaint du TPaintBox

et pour finir modifier le OnClick du Button1 comme ceci :

procedure TForm1.Button1Click(Sender: TObject);
var
  hrgn1 : Hrgn;
begin
// CreateEllipticRGN(Left, Top, Right, Bottom)
// Crée une ellipse au centre du panel
  hrgn1 := CreateEllipticRgn(Panel1.Width Div 4, Panel1.Height Div 4, Panel1.Width - (Panel1.Width Div 4), Panel1.Height - (Panel1.Height Div 4));
// Et on l'affecte au panel 
  SetWindowRgn(Panel1.handle, hrgn1, true);
  DeleteObject(hrgn1); // Ne pas oublier
end;

 
@+
Cirec

<hr size ="2" />
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 déc. 2006 à 01:02
Une de plus ...
Mais cette fois elle utilise CombineRGN :

procedure TForm1.Button3Click(Sender: TObject);
var
  hrgn1, hrgn2: Hrgn;
  I, J : Integer;
begin
  Canvas.Brush.Color := clBtnFace;
  PaintBox1.Canvas.Brush.Bitmap := Bmp1;
  J := PaintBox1.Width Div 2;
  For I : = 1 to J do
  Begin
    hrgn1 := CreateEllipticRgn(I, I, PaintBox1.Width - I, PaintBox1.Height - I);
    FillRgn(PaintBox1.Canvas.Handle, hrgn1, PaintBox1.Canvas.Brush.Handle);
    hrgn2 := CreateRectRGN(0,0, PaintBox1.Width, PaintBox1.Height);
    CombineRGN(hrgn2, hrgn1, hrgn2, RGN_xor);
    DeleteObject(hrgn1);
    FillRgn(PaintBox1.Canvas.Handle, hrgn2, Canvas.Brush.Handle);
    DeleteObject(hrgn2);
  End ;
  PaintBox1.Invalidate;
end;

et tu peux t'ammuser entre Button2 et Button3

Bien sur c'est perfectible mais je le laisse tel quel c'est plus facile à  comprendre
 
@+
Cirec

<hr size ="2" />
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
13 déc. 2006 à 14:26
merci foxi,

je viens de comprendre et si je te suis, il faut considérer avoir deux régions
(l'image et l'ellipse) et utiliser une combinaison OR ou XOR ou AND etc..

function CreateEllipticRgn(p1, p2, p3, p4 : integer) : HRGN;
function CombineRgn(p1, p2, p3 : HRGN ; p4 : integer) : HRGN;

c'est bien çà ?

cantador
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
13 déc. 2006 à 19:11
Bon, ben, j'ai bossé qd même un peu..
mais..sniff..

çà ne marche pas..

unit Unit1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;


type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;


var
  Form1: TForm1;
  Bmp1: TBitMap;


implementation


{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  Bmp1 := TBitmap.Create;
  Bmp1.LoadFromFile('Image1.bmp');
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  hrgn1, hrgn2: integer;
begin
  hrgn2 := CreateEllipticRgn(100, 35, 0, 120);
  hrgn1 := PaintBox1.Canvas.Handle;
  CombineRgn(hrgn1, hrgn1, hrgn2, RGN_XOR);
  SetWindowRgn(handle, hrgn1, true);
end;


procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.Draw(0, 0, Bmp1);
end;


end.

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
13 déc. 2006 à 23:09
Oh oui !
merci cirec..
et donc, pas besoin dans cet exercice de la fonction CombineRgn..

cantador
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 déc. 2006 à 00:05
Non c'est pas utile ici mais ça reste tout de même très utile dans la construction de formes plus complexes

Voici une variante qui évite de changer la forme du panel :

Tu mets en commentaire le OnPaint du TPaintBox et tu ajoutes un TButton et tu complètes comme suit :
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  //PaintBox1.Canvas.Draw(0, 0, Bmp1);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  hrgn1: Hrgn;
  I, J : Integer;
begin
  PaintBox1.Invalidate;
  Application.ProcessMessages;
  PaintBox1.Canvas.Brush.Bitmap := Bmp1;
  J := PaintBox1.Height Div 2;
  For I : = J Downto 1 do
  Begin
  hrgn1 := CreateEllipticRgn(I, I, Panel1.Width - I, Panel1.Height - I);
  FillRgn(PaintBox1.Canvas.Handle, hrgn1, PaintBox1.Canvas.Brush.Handle);
  Sleep(5);
  DeleteObject(hrgn1);
  End ;
end;

have fun
 
@+
Cirec

<hr size ="2" />
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
14 déc. 2006 à 17:55
Je profite d'un peu de vacances pour toucher de la programmation que je ne fais pas sur un plan professionnel et cela m'amuse bcp.. et c'est très intéressant..
Tes dernières formules me plaisent plus car elles abandonnent le panel..
du moins je le crois..et  si je veux faire un peu d'animation cela me semble plus léger.

En tout cas merci encore pour ces exemples que je vais étudier avec soin.

cantador
0
Rejoignez-nous