Decouper une image

Messages postés
49
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
8 août 2009
-
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
-
salut les pro

peut-ont decouper une image en 4 ou 6 morceau et les afficher chaqu'un dans un Timage comme pour les puzzle par exemple

plus on vie plus on apprend

11 réponses

Messages postés
3827
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
16 décembre 2021
46
Salut,
Voici un petit exemple simple
ce n'est qu'une ébauche vite faite on peut encore facilement optimiser le code

Il faut que l'image contenue dan Image1 soit un Bmp

procedure TForm1.Button1Click(Sender: TObject);
Var Bmp1, Bmp2, Bmp3, Bmp4 : TBitMap;
aWidth, aHeight : Integer;
begin
// pour obtenir 4 Bmp on divise la hauteur et la largeure par 2
aWidth := Image1.Width div 2;
aHeight := Image1.Height div 2;
// on crée les 4 Bitmap et on les mets à la bonne taille
Bmp1 := TBitmap.Create;
Bmp1.Width := aWidth;
Bmp1.Height:= aHeight;


Bmp2 := TBitmap.Create;
Bmp2.Width := aWidth;
Bmp2.Height:= aHeight;


Bmp3 := TBitmap.Create;
Bmp3.Width := aWidth;
Bmp3.Height:= aHeight;


Bmp4 := TBitmap.Create;
Bmp4.Width := aWidth;
Bmp4.Height:= aHeight;
// on copie chaque partie dans les Bitmap
Bmp1.Canvas.CopyRect(Rect(0,0,aWidth,aHeight), Image1.Picture.Bitmap.Canvas,Rect(0,0,aWidth,aHeight));
Bmp2.Canvas.CopyRect(Rect(0,0,aWidth,aHeight), Image1.Picture.Bitmap.Canvas,Rect(aWidth,0,aWidth*2,aHeight));
Bmp3.Canvas.CopyRect(Rect(0,0,aWidth,aHeight), Image1.Picture.Bitmap.Canvas,Rect(0,aHeight,aWidth,aHeight*2));
Bmp4.Canvas.CopyRect(Rect(0,0,aWidth,aHeight), Image1.Picture.Bitmap.Canvas,Rect(aWidth,aHeight,aWidth*2,aHeight*2));
// on les affiches sur la form pour voir le résultat
Canvas.Draw(0,0, Bmp1);
Canvas.Draw(aWidth,aHeight, Bmp2);
Canvas.Draw(aWidth*2,aHeight*2, Bmp3);
Canvas.Draw(aWidth*3,aHeight*3, Bmp4);
// et on libère les Bitmap que l'on à crées
Bmp1.Free;
Bmp2.Free;
Bmp3.Free;
Bmp4.Free;
end;

@+
Cirec
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
salut,

tu peux utiliser le zonage de l'image.Vas voir cette source elle te donnera une exemple

DÉTECTION DE "ZONES" SUR UNE IMAGE



@+

jlen
Messages postés
3827
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
16 décembre 2021
46
Merci Jlen pour ce lien elle est géniale cette source

@+
Cirec
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
li n'y a pas de quoi mais je n'arrive pas à retrouver dans l'aide delphi ce qui concerne le zonage.

je sais que cela existe pour l'avoir déjà utilisé (pas souvent je l'admets) mais là j'ai un trou et je rage!!



@+

jlen
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
j'ai quand même retrouvé la rubrique de l'aide concernant les régions :

Cet exemple crée une région et la sélectionne comme rectangle pour le
canevas du composant Image. Il définit ensuite la couleur du pinceau du
canevas en rouge et appelle FillRect en utilisant ClipRect comme zone à
remplir. Enfin, ClipRect est redéfini à la valeur originale qu'il
contenait en appelant SelectClipRect avec nil comme deuxième paramètre
et supprime la région.



procedure Form1.Button1Click(Sender: TObject);

var



MyRgn: HRGN ;



begin



MyRgn := CreateRectRgn(100,100,200,200);

SelectClipRgn(Image1.Canvas.Handle,MyRgn);

Image1.Canvas.Brush.Color := clRed;

Image1.Canvas.FillRect(Image1.Canvas.ClipRect);

Image1.Invalidate;

SelectClipRgn(Image1.Canvas.Handle,nil);

DeleteObject(MyRgn);



end;

@+

jlen
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
En cherchant un peu plus vas voir également le tuto de NoNo40:

ICI

dont voici un extrait:

Les fenêtres non
rectangulaires




Les screenmates les plus aboutis
travaillent avec des fenêtres non rectangulaires... Pour
utiliser cette fonctionnalité apparu sous windows 95, on
passe par la fonction setWindowRgn qui affecte une région
à une fenêtre. Une région peut être un rectangle dans
le cas standard des fenêtres, mais également un cercle,
une ellipse.. et une combinaison de régions. Le programme
ci desous crée des trous dans une fenêtre, identifiée à
partir de son handle que l'on récupère par exemple à
l'aide du programme catch.




//---------------------------------------------
//-- Programme gruyère
//---------------------------------------------
//-- © 2000-2001 NetSwiPE
//-- htpp://www.netswipe.ch
//---------------------------------------------
unit Unit1;

interface

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

type
TForm1 = class (TForm)
ediHandle: TEdit;
butGo: TButton;
procedure FormCreate(Sender: TObject);
procedure butGoClick(Sender: TObject);
private
public
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
ediHandle.text : = inttostr(self.handle);
end;

procedure TForm1.butGoClick(Sender: TObject);
var i, j, x, y : integer;
region1, region2 : hRgn;
rect : TRect;
begin
getwindowrect(strtoint(ediHandle.text), rect);
region2 := createRectRgn(0,0, rect.Right - rect.Left, rect.Bottom - rect.top);
i := (rect.Right - rect.Left) div 20;
for j : = 1 to i do
begin
x := random(rect.right - rect.left);
y := random(rect.bottom - rect.top);
region1 := createEllipticRgn(x, y, x+50, y+50);
combineRgn(region2, region2, region1, RGN_DIFF);
end;
setWindowRgn(strtoint(ediHandle.text), region2, true);
end;

end.
Messages postés
49
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
8 août 2009

Merci pour votre attention ca fait plaisir d'avoir des pot comme vous les gars

plus on vie plus on apprend
Messages postés
41
Date d'inscription
mardi 15 juin 2004
Statut
Membre
Dernière intervention
31 mars 2006

Bonjour/Bonsoir,
Place Form1 en mode transparent, ensuite ouvre l'application Photoshop CS2 ou version inférieur pour créer un puzle ensuite dans Delphi2006 ou version inférieur place ton et tes composants "Image" comprenant tes pièces de puzles. Et bien sûr, des images découpés à toute les sauces conviennent aussi.

Voilà, c'est tout simple. Que devoir taper des centaines de lignes de codes ! Ou se trouver dans listing gruyardant !
Bonne continuation...

WOLF691300 ((( hmmm... je sens que des commentaires critiques vont me tomber dessus ... Enfin, celà m'amuse ..
Messages postés
3827
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
16 décembre 2021
46
@ Wolf


ouais c'est pas bête mais avec cette méthode Koiz n'aura rien apprit puisqu'il faut utiliser une application extérieur alors que c'est possible de le faire avec Delphi, d'accord ça fait plus de lignes de code mais c'est bien plus satisfaisant et enrichissant quand on la fait soi même
n'est il pas

@+
Cirec
Messages postés
41
Date d'inscription
mardi 15 juin 2004
Statut
Membre
Dernière intervention
31 mars 2006

Oui Cirec, faire son puzle ou par exemple faire des dégradés de couleurs en utilisant Photoshop fais gagner du temps et des codes, et je suis d'accord avec toi de le faire aussi par code, mais parfois c'est utile quand on est pressé et qu'on désire de faire de super création via par d'autres applications et aussi pour rendre le listing des codes plus compréhensible ... etc ... etc ...

Tout le monde à son truc et heureusement ... si tout le monde ferai la même chose, on perd le sens de l'immagination ...

Wolf691300.
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
salut,



wolf l'astuce est intéressante ....à condition d'avoir Photoshop installé.

d'autre part

1) tous les composant posés sur la form subiront le mode transparent (esssayes en mode XP avec des boutons et staitictext)

2) la zone transparente (non visible) du Timage est toujours sensible
et pour le déplaceement des piéces se chevauchant c'est pas terrible.

Pour la clareté du code rien ne t'empêche de faire une unité séparée
dans laquelle tu mets le code et tu appelles la fonction dans le code
principal :

1) cela évite la programmation à "l'arrache"

2) tu peux réutiliser cette fonction dans d'autres programmes.

d'autre part les solutions que j'ai données vont beaucoup plus
loin que la simple confection q'un pulzze en particulier tu peux y
mettre des zones sensibles ajustées à la forme de la zone. Dans ton cas
il faudra quand même passer par la définition des régions si tu veux
réaliser une telle fonction et tu n'auras rien gagné sur la taille du
code



@+

jlen