Decouper une image

koaiz Messages postés 49 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 8 août 2009 - 1 mars 2006 à 08:47
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 - 3 mars 2006 à 10:03
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

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
1 mars 2006 à 13:57
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
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
1 mars 2006 à 15:50
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
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
1 mars 2006 à 16:09
Merci Jlen pour ce lien elle est géniale cette source

@+
Cirec
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
1 mars 2006 à 16:15
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
0

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

Posez votre question
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
1 mars 2006 à 16:37
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
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
1 mars 2006 à 17:59
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.
0
koaiz Messages postés 49 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 8 août 2009
2 mars 2006 à 09:41
Merci pour votre attention ca fait plaisir d'avoir des pot comme vous les gars

plus on vie plus on apprend
0
wolf691300 Messages postés 41 Date d'inscription mardi 15 juin 2004 Statut Membre Dernière intervention 31 mars 2006
3 mars 2006 à 00:06
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 ..
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
3 mars 2006 à 01: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
0
wolf691300 Messages postés 41 Date d'inscription mardi 15 juin 2004 Statut Membre Dernière intervention 31 mars 2006
3 mars 2006 à 08:14
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.
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
3 mars 2006 à 10:03
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
0
Rejoignez-nous