Découper une image selon une figure prédéfinie [Résolu]

cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 12 déc. 2006 à 22:50 - Dernière réponse : cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 13 déc. 2006 à 01:55
3
Merci
avec les regions tout simplement...

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de f0xi
Meilleure réponse
Cirec 4224 Messages postés vendredi 23 juillet 2004Date d'inscription 5 juin 2018 Dernière intervention - 13 déc. 2006 à 21:53
3
Merci
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" />

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de Cirec
Meilleure réponse
Cirec 4224 Messages postés vendredi 23 juillet 2004Date d'inscription 5 juin 2018 Dernière intervention - 14 déc. 2006 à 01:02
3
Merci
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" />

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de Cirec
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 13 déc. 2006 à 14:26
0
Merci
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
Commenter la réponse de cs_cantador
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 13 déc. 2006 à 18:33
0
Merci
J'ai trouvé l'exemple de ZeWaren :http://www.delphifr.com/codes/TOUT-SUR-REGIONS_23881.aspx

mais il me manque encore un truc..

cantador
Commenter la réponse de cs_cantador
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 13 déc. 2006 à 19:11
0
Merci
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
Commenter la réponse de cs_cantador
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 13 déc. 2006 à 23:09
0
Merci
Oh oui !
merci cirec..
et donc, pas besoin dans cet exercice de la fonction CombineRgn..

cantador
Commenter la réponse de cs_cantador
Cirec 4224 Messages postés vendredi 23 juillet 2004Date d'inscription 5 juin 2018 Dernière intervention - 14 déc. 2006 à 00:05
0
Merci
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" />
Commenter la réponse de Cirec
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 14 déc. 2006 à 17:55
0
Merci
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
Commenter la réponse de cs_cantador

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.