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 : traiter une image en tache de fond [ Mutimédia / Image & Vidéo ] (Oniria)

samedi 12 janvier 2008 à 20:24:19 | traiter une image en tache de fond

Oniria

Bonjour,

Je suis en train de développer un logiciel de cartographie qui utilise des cartes au format bmp (elle font 2000 par 2000 pixels). elles sont assemblées entre elle pour former une carte bien plus grande (1Go de taille).

pour afficher la carte sur un TImage, je détermine quelles sont les fichiers utilisé, je les lit un par un dans un TImage temporaire, et pour chaque fichier, je fait une boucle For pour transferer les points du TImage temporaire vers le TImage de la Form.

Le probléme, c'est que j'aimerais calculer le tracé dans un TImage de trace de même dimension que le TImage de la form, puis transférer cette image de trace dans celle de la form. Je pourrais ainsi mettre dans la fonction Image.Paint, une fonction de transfert rapide de l'image de trace vers la form plutot que de tout recalculer.

je vous met la fonction de transfert de TImage temporaire vers le TImage de la form

xcc1,ycc1 représente le coin supérieur gauche de l'image TImage temporaire
xdd1,ydd1 représente le coin inférieur droit de l'image TImage temporaire



for i:=xcc1 to xdd1 do
                      begin
                        Application.ProcessMessages;

                        for j:=ydd1 to ycc1 do
                          begin
                            // coordonnée du point i,j (coordonnées écran) en coordonnées xi,yi (coordonnées générales)
                            {xi:=trunc((i*zoom)+xo1);
                            yi:=trunc(yo1-(j*zoom));
                            // xi,yi (coordonnées générales) en coordonnées xi,yi  (coordonnées image carte)
                            xi:=xi-xcarte*CT_LongCarte;
                            yi:=CT_LongCarte-(yi-ycarte*CT_LongCarte);
                            }
                            xi:=trunc((i*zoom)+xo1-xcarte*CT_LongCarte);
                            yi:=trunc(CT_LongCarte-(yo1-(j*zoom)-ycarte*CT_LongCarte));
                            couleur:=FMain.ImageTemp.Canvas.Pixels[xi,yi]; // on prend la couleur d'image temp
                            FMain.ImageTrace.Canvas.Pixels[i,j]:=couleur; // on écrit la couleur
                          end; // fin j
                      end; // fin i  

Ce type de fonctionnement est très lent et j'aimerais optimiser tout ca mais je ne vois pas comment faire.

Si quelqu'un pourrait me dire s'il existe une fonction permettant de copier plus rapidement une zone rectangulaire d'une image vers une autre. Et par la même, comment transférer une image vers une autre.

Merci pour vos réponse

Oniria

samedi 12 janvier 2008 à 20:53:10 | Re : traiter une image en tache de fond

WhiteHippo

Membre Club
Bonsoir

Un petit tour ici , entre autre, s'impose pour le traitement d'image avec le ScanLine

Cordialement.

"L'imagination est plus importante que le savoir." Albert Einstein

samedi 12 janvier 2008 à 21:48:32 | Re : traiter une image en tache de fond

cirec

Membre Club Administrateur CodeS-SourceS
Salut,

il est très utile de connaitre l'utilisation de ScanLine
mais pour ton cas précis je te conseil un transfert par bloc qui est la méthode la plus rapide ...

Voir BitBlt, StretchBlt
BitBlt( CanvasDest.Handle, PosDX, PosDY, Width, Height, CanvasSource.Handle, PosSX, PosSY, srcCOPY);

PosDX, PosDY : coin suppérieur Gauche de destination
Width, Height : Taille
PosSX, PosSY :  coin suppérieur Gauche de la source

 
@+
Cirec


dimanche 13 janvier 2008 à 21:28:04 | Re : traiter une image en tache de fond

Oniria

Bonjour à vous deux,

Merci d'avoir répondu aussi vite, je vais tester ce que vous m'avez conseillé et je vous donnerais une réponse.

Oniria

dimanche 20 janvier 2008 à 18:59:21 | Re : traiter une image en tache de fond

Oniria

Bonjour,

Pour répondre, je ne peut pas utiliser scanline car je doit faire une mise à l'échelle de l'image. (en agrandissement ou en réduction). J'ai compensé le systéme en dévalidant la barre d'outils et l'image de manière à empécher toutes les intéractions de l'utilisateur pendant le calcul (je ne le fais que pour un déplacement ou un zoom). Le calcul se fait dans un Bitmap temporaire. Et l'événement OnPaint du TImage de la Form, je fait juste une assignation.

Oniria

dimanche 20 janvier 2008 à 20:01:04 | Re : traiter une image en tache de fond

cirec

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Voici un exemple qui fait une copie en agrandissant 2x

Il faut 2 TImage et 1 TButton
Charge un Bitmap dans Image1 (assez grand plus de 200 x 200)

Procedure TForm1.Button1Click(Sender: TObject);
Var BmpDest : TBitmap;
Begin
  
BmpDest := TBitmap.Create;
  Try
    
{prépare le Bitmap de destination}
    BmpDest.Width := 200;
    BmpDest.Height := 200;
    {Meilleur qualité}
    SetStretchBltMode(BmpDest.Canvas.Handle, HALFTONE);
    {Effectue une copie avec Stretch}
    StretchBlt(BmpDest.Canvas.Handle, //Handle de destination
      0, 0, 200, 200, //Rectangle de destination (correspond à BmpDest)
      Image1.Picture.Bitmap.Canvas.Handle, //Handle Source
      200, 200, // Top,Left de la partie a copier
      100, 100, // Width Height de la partie a copier
      {ce qui fait un carré de 100 de coté }
      srcCOPY);
    {et on affiche le résultat}
    Image2.Picture.Bitmap.Assign(BmpDest);
  Finally
    
BmpDest.Free;
  End;
End;
Highlighted with Pas2HTML

Il est également possible de cibler un rectangle bien précis avec ScanLine mais c'est un peut plus compliqué et surtout pas utile pour ce que tu veux faire ici

@+
Cirec


lundi 21 janvier 2008 à 08:51:02 | Re : traiter une image en tache de fond

Oniria

Bonjour,

Merci beaucoup, cette méthode marche super bien, c'est mieux que ce que j'ai finalement fait pour l'impression d'une image. Dans le cas du trace de la carte à l'écran, j'avais besoin de copier des zones d'autres images avec un facteur de zoom et non une image à adapter, la copie était plus difficile.

En tout cas, merci beaucoup, ca m'enleve une sacrée épine du p...programme :)

Comme les cartes ont été récupéré sur google, je ne peut pas les mettre sur le site (droit d'auteur), mais je vais mettre ce petit programme sur delphifr avec une explication du fonctionnement des cartes et de leurs créations.

Oniria



Cette discussion est classé dans : image, coordonnées, timage, xi, yi


Répondre à ce message

Sujets en rapport avec ce message

SavePictureDialog utilisation ? [ par g0belin ] Comment est ce que l'ont utilise le composant TSavePictureDialog.Si je veux enregistrer une image qui se trouve dans le TImage 1 ???------------------ Problème avec les images et leur fond [ par fab30 ] Salut a tous, voilà, j'ai un probleme avec le Timage de Delphi : Sur ma forme, il y a un Timage avec une image de fond en bmp. Dessus, je rajoute un T Timage [ par yvemoreau ] yvele problème: j'ai une image bitmap qui pèse 700k dans une Form j'ai encodé les Picture.Data dans un unit pour l TImage problème [ par MasterNKZ ] Je veux faire une animation tres simple:j'ai une image dans un composant TImage et je la déplace a l'aide d'un timer 4 pixel par 4pixel tout les 70ms 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 Faire fonctionner TImage.Picture [ par timeplus ] Bonjour,J'affiche une image (.bmp) dans le fond d'une MDI mais je voudrais pouvoir changer de temps en temps cette image. La localisation (répertoire retailler et copier une image sans utiliser TImage [ par skrol29 ] Bonjour,Je développe une mini visionneuse de fichier JPG en Delphi.En bas de l'image en cours, j'affiche une ribambelle horizontale qui contient toute Détecter souris hors d'un Timage [ par JackTheRipp3r ] Salut @ tous !Voilà, je suis en train de créer une application dont le design est totalement modifié, et là j'en suis aux boutons agrandissement quitt Chercher une form dans un TImage [ par blue71 ] Voila, je veux fair eun programme, qui depuis un TImage charger une image que j ai decidé sur paint, Le fond est bleu et les rond sont rouge, J'arrive Drag Drop [ par Hnimsgern ] Le code suivant provient de l'héritage du composant Tbutton.le dragdrop ne fonctionne plus lorsque je rajoute un composant TImage et déclare son paren


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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,296 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é.