Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Modifier taille bitmap [ Archives / Graphique ] (seba31stien)

mercredi 10 mai 2006 à 11:45:11 | Modifier taille bitmap

seba31stien

Bonjour,
dans mon appli, je charge une carte au format bitmap dans un paintbox.
Cependant, la procédure StretchDraw :
Paintbox1.canvas.StretchDraw(PaintBox1.ClientRect,BmpM); étire bien la carte mais dès que je dessine sur cette carte, les positions sont aussi étirées: plus je m'éloigne de la position (0,0), plus l'image que je déplace s'éloigne de la souris alors qu'elle devrait être dessous.
J'ai opté pour la solution de redimensionner mon image avec paint, puis de la charger sur mon appli. Cette solution n'étant que temporaire, je souhaiterias redimensionner cette image avec mon appli comme le permet paint
merci
Seb

mercredi 10 mai 2006 à 15:14:35 | Re : Modifier taille bitmap

florenth

Membre Club
Alors, c'est toujours un problème quand on dessine sur un TPaintBox.
Enfin, avec un peu de méthode, on y arrive.
Tout d'abord, tu aurais du poster ce que tu as mis dans l'évenement OnPaint de ton PaintBox, ça aurait pu nous aider.

Ensuite, normalement, quand tu dessine sur un PaintBox, au prochain dessin, tu dois tout redessiner. tu devrais peut être passer pa un bimap temporaire avant de dessiner sur ton PaintBox.

A + pour un bout de code (met aussi l'évent OnMouveMove, OnMouseDown et OnMouseUp, mieux vaut plus que pas assez)

++

Si tu ne te plantes pas ......
tu ne pousseras jamais

mercredi 10 mai 2006 à 15:40:59 | Re : Modifier taille bitmap

seba31stien

Réponse acceptée !
Voici mon code :

procedure TForm1.FormCreate(Sender: TObject);
Var
  i : integer;
begin
.....
  BmpM := tbitmap.create;
  BmpM.LoadFromFile('C:\...carte_dept31__.bmp'); // chargement de la carte dans OrigBmp
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
    Paintbox1.canvas.draw(0,0,BmpM);  // c'est bmpm qui est à jour
end;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  i : integer;
  p : tpoint;
begin
  courant := 0;     // pas de curseur actif
  p.x := X;  p.y := Y;
  // Si clic dans curseur existant (ptInRect est une fonction GDI Windows)
//  For i := 1 to maxcur do if ptinrect(cc[i].rr, p) then courant := i;
  For i := 1 to maxcur
  do if ptinrect(cc[i].rr, p)
     then begin  // on a cliqué sur un rectangle de site
            courant := i;
            if ( waitforsecondsite and new_link_en_cours) // l'appli attend qu'on clique sur  un autre triangle pour relier les deux
            then begin
                   PaintBox1.Canvas.Pen.Color:=clBlue;
                   PaintBox1.Canvas.Pen.Style:= psSolid;
                   CC[courant].bond[site_initial_bond]:=True;
                   CC[site_initial_bond].bond[courant]:=True;
                   PaintBox1.Canvas.Polyline([cc[site_initial_bond ].centre,cc[courant ].centre ]);    // trace une ligne entre deux "triangles"
                   PaintBox1.Canvas.Pen.Color:=clBlack;
                   waitforsecondsite:=not waitforsecondsite;
                   exit;
                 end;
            if ( not waitforsecondsite and new_link_en_cours) // l'appli attend qu'on clique sur le 1er triangle du lien
            then begin
                   site_initial_bond:=courant;
                   waitforsecondsite:=not waitforsecondsite;
                   exit;
                 end;
            if ( not new_link_en_cours) //
            then begin // on est peut être en train de déplacer un site donc il faut effacer les liaisons
                //rien pour l'instant

                 end;
          end;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin

  IF ((courant = 0) or new_link_en_cours ) then exit;
  IF cc[courant].drawing then
  begin
     // les nouvelles positions son mémorisées sous forme de rectangle
     // ce principe permet de déformer l'objet en plus de le déplacer
     cc[courant].rr := rect( x-c1,  y-c2,   x+c1,  y+c2); // nouvelle position du rectangle
         // c1 et c2 sont les longueurs de la base et de la hauteur du triangle
     dessinecurseur(courant);  // procedure qui dessine un triangle (ou curseur)
     Rafraichir_Liaisons;  // procedure qui redessine tous les liens entre triangles tracés auparavant
  end;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if courant=0 then exit;
  dessinecurseur(courant);
  Rafraichir_Liaisons;// procedure qui efface puis trace les liaisons
  courant:=0;
  CC[courant].drawing:=false;
end;

pour info : CC[x] est de type :
type  TSite = record    // caractéristiques d'un cuseur
     drawing : boolean;   // en cours de déplacement
     rr  : trect;         // rectangle position courante
     rro : trect;         // ancien ancienne position
     colo : tcolor;       // couleur
     centre : Tpoint;  // centre du triangle
end;

voilà, bonne lecture ...

mercredi 10 mai 2006 à 15:51:37 | Re : Modifier taille bitmap

florenth

Membre Club
Pour ton problème, je ne vois pas trop du fait que tu places des triangles sur ta carte (correspondants à des sites) que tu peux déplacer et aussi relier entre eux.

En plus, tu oublies de préciser que CC[x] contient aussi un array of Boolean à ce que je vois. Mais ça, c'est pas grave.

Le truc, c'est que tes procédures DessineCurseur() et Rafraichir_Liaisons() dessinent-elles directement dans le PaintBox ou alors dans le BmpM ??

Alors là, ça coince pour moi. Désolé.



Si tu ne te plantes pas ......
tu ne pousseras jamais

mercredi 10 mai 2006 à 16:08:06 | Re : Modifier taille bitmap

Abadianet

Membre Club
Salut Seb, Et si tu redimensionnais ton BMP avant, aurais-tu le même problème ? Pour redimensionner un BMP, tu as plein d'exemples dans le forum. Tu peux prendre le source de Pilot All posté dans les sources du site ou sur www.abadiane.net et voir dans l'unité UTools.pas la fonction ImageResizeToBMP Abadiane

mercredi 10 mai 2006 à 16:16:30 | Re : Modifier taille bitmap

seba31stien

Réponse à florenth :
je dessines dans le bmpm :
  bmpm.canvas.polygon([point(p1, r.top ),
                       point( r.right  -round(c1/2) , r.bottom -round(c2/2)),
                       point(r.left +round(c1/2), r.bottom -round(c2/2)),
                       point(p1, r.top )]);

réponse à Abadiane : je consulte le site

mercredi 10 mai 2006 à 16:33:25 | Re : Modifier taille bitmap

florenth

Membre Club
Ah, si tu dessines dans le BmpM, c'est normal que ça marche pas.
Car si ta souris est sur le pixel 100,100 de ton PaintBox, comme l'image qui est dedans est agrandie, cela correspond peut être au point 30,30 du BmpM. En gros, il faut appliquer le facteur de redimentionnement horisontal et vertical (calculé par la méthode StrctchDraw) et l'appliquer aux coordonées du curseur.

Bre, quel bazar.

Alors que si, dès le départ, tu as BmpM de la même taille que ton PaintBox, là, plus de problèmes.
Tu dois alors modifier ta procédure FormCrate comme suit :

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
 
BmpTemp: TBitmap;
begin
  //
 
BmpTemp := TBitmap.Create;
 
BmpTemp.LoadFromFile('C:\...carte_dept31__.bmp');
  BmpM := TBitmap.Create;
  BmpM.Width := PaintBox.Width;
  BmpM.Height := PaintBox.Height;
  BmpM.Canvas.StretchDraw(BmpM.Canvas.ClipRect, BmpTemp);
  BmpTemp.Free;

end;

et ta procédure PaintBoxPaint comme ça :

begin
  PaintBox.Canvas.Draw(0, 0, BmpM);
end;



Si ça ne marche pas, dis nous ce qui cloche avec un maximum de détails.
++

Si tu ne te plantes pas ......
tu ne pousseras jamais

mercredi 10 mai 2006 à 16:48:04 | Re : Modifier taille bitmap

seba31stien

merci florenth, ça marche impeccable mais lorsque je quitte l'appli, j'ai violation d'accès ..; puis plein de messagedlg :' runtime error 216 at 00405E86'
ça te parle ?


mercredi 10 mai 2006 à 16:49:27 | Re : Modifier taille bitmap

seba31stien



Seb, 23 ans, Toulouse
débutant en delphi

mercredi 10 mai 2006 à 16:50:14 | Re : Modifier taille bitmap

seba31stien


l'erreur intervient si on a créé au moins un site (dessiner un triangle)
si on ouvre et on quitte, ça ne fait pas l'erreur


1 2 3

Cette discussion est classé dans : appli, image, modifier, carte, bitmap


Répondre à ce message

Sujets en rapport avec ce message

Convetir une imag en Bitmap [ par sebastienbro ] Je veux convertirune image en ICO, mais il me met une erreur : Image icône incorrectAidez moi !!!!! ListImage et boucle [ par idaho69 ] petite explication de la situation :une image (jeu.bmp) contenant un jeu de cartes (54 cartes=52+le dos + face nue) le tout mis dans imagelist1L'on sa Prob DLL des ressources bitmap [ par ahmed12 ] Je utilise une dll qui contient des bitmaps a pris avoir compiler une ressource.Et j'ai arrivé de charger ces bmp dans la l'application Hote avec ce Carte Son VIRTUELLE [ par emmanuelgo ] salut à tous!bon j'ai déjà posé une question en rapport avec celle-ci sur le forum ( http://www.delphifr.com/forum.v2.aspx?ID=359066 ) mais si je crée Pb conversion image. [ par Becracker ] Salut les gars, Je suis entrain de faire un convertisseur d'image Bmp à Gif. J'ai mis le code suivant mais il ya une er Copie d'une partie d'un image [ par Rapakooti ] Alors mon pb viens du fait que j'essaie de faire une applique skinnable et par soucis de facilite lors de la creation des futur skins , toutes les ima comment affecter une bitmap a une image [ par didulle ] Salut tout le mondej'aimerais utilisé une variable de type bmp sur laquelle j'effectue des traitements. mais dés que je l'affecte à l'image il y a rie TBitmap et occupation mémoire [ par ThWilliam ] Bonjour à tous. <p class="MsoNorma Comment modifier la palette d'un Bitmap 256 couleurs ? [ par Toya78 ] Bonjour,Je cherche à modifier une couleur d'un TBitmap 256 couleurs en intervenant directement sur sa palette (je cherche à modifier le blanc en rouge Appliquer un cadre de couleur ou avec un bitmap [ par cincap ] Bonjour à toutes et à tous,Voici mon problème du jour, après avoir redimensionné une image et avant de la sauver en jpeg, est t'il possible de lui app


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.