IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Charger et imprimer une image


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut Charger et imprimer une image
    Bonjour a tous,

    J'ai reussi a imprimer du texte en utilisant la bibliotheque windows mais, je voudrais savoir comment peut on charger et imprimer une image en c++. D'apres mes recherches il faudrait apparement utiliser la fonction loadImage() de cette meme API windows pour charger l'image en question, mais je ne vois pas comment l'employer et quelle fonction utiliser pour imprimer l'image.

    Merci par avance.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Points : 31
    Points
    31
    Par défaut
    Bonjour,
    Si tu n'as pas l'obligation d'utiliser l'API Windows, tu peux essayer avec une API gratuite qui s'appelle QT.

    Tu charge une image avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QImage monImage("monFichier.jpg")
    Ensuite, pour imprimer, tu peux lire cette page : ICI
    Le code devrait ressembler de près ou de loin à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    QPrinter printer;
    QPrintDialog printDialog(&printer, NULL);
    if (printDialog.exec())
    {
       QPainter painter(&printer);
       QRect rect = painter.viewport();
       QSize size = monImage.size();
       size.scale(rect.size(), Qt::KeepAspectRatio);
       painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
       painter.setWindow(monImage.rect());
       painter.drawImage(0, 0, monImage);
    }
    Plus de détail sur ce code ICI


    Cordialement,

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Merci de ta reponse,

    En fait,je dois developper une application permettant d'imprimer des cartes magnetiques. Or l'api du constructeur de l'imprimante, est basé sur l'exploitation de l'api windows nottament pour l'encodage sur la bande magnetique de la carte. Est-il possible cependant de combiner l'utilisation de qt et l'api windows lors de l'impression ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Scrolle en bas de l'aide en ligne de LoadImage. Il y a des exemples d'utilisation de cette fonction, cachés entre les lol et autres $0.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Points : 31
    Points
    31
    Par défaut
    En fait l'API QT s'appuie sur l'API windows (quand le programme est compilé sous windows). Il est tout à fait possible de mixer les deux, par contre, je ne l'ai jamais fait car je développe essentiellement sous linux.

    Tu peux peut être essayer les codes que j'ai mis dans le post précédent. Il te faudra donc lier sur qtgui.lib, tu peux télécharger le SDK de QT, ensuite, tu l'installe sur ta machine, il y a les binaires pour la plus part des IDE, tu ne devrais pas avoir à recompiler la librairie.

    Ca risque tout de même de faire pas mal de travail pour arriver à imprimer. Peut être devrais tu essayer d'insister sur l'API windows, car l'API QT a elle aussi sa propre logique, et il faut rentrer dedans pour arriver à faire ce que l'on veut.

    Mais pour l'API windows, je botte en touche, je ne connais pas, et je ne suis pas très familier avec le MSDN...

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    J'ai donc essayer d'imprimer l'image en utilisant la bibliotheque windows, mais sans succes:

    voici le code que j'ai essayé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    LPTSTR lien=TEXT("fond.bmp");
    HANDLE bitmap;
    bitmap = LoadImage(NULL,lien,IMAGE_BITMAP,0,1000,LR_LOADFROMFILE);
    DrawState(hCardDC,NULL,NULL,(long)bitmap,NULL,10,10,0,0,DST_BITMAP);
    Lorsque j'execute le test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(bitmap)
    {
          MessageBox(NULL, TEXT("image presente"), TEXT("Test"),MB_OK);
    }
    La boite de dialogue s'affiche correctement, ce qui indique que l'image se charge correctement.
    Le probleme ne viendrait il pas de la fonction DrawState() qui ne conviendrait pas pour l'impression ?
    ou serait-ce du a un mauvais emploi de celle ci?

  7. #7
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Je ne connais pas cette fonction DrawState, mais si tu as accès aux MFC, tu peux toujours tenter le bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    	HBITMAP hBmp;// L'image que tu veux imprimer
    	int iBmpWidth, iBmpHeight;// Dimensions de l'image
    	// Création de la boite de dialogue d'impression ( celle avec le choix de l'imprimante ...)
    	CPrintDialog dialog( FALSE, PD_USEDEVMODECOPIES | PD_NOSELECTION);
     
    	if (m_pApp->GetPrinterDeviceDefaults( & dialog.m_pd) && dialog.DoModal() == IDOK)
    	{
    		// Récupération de la résolution de l'imprimante afin de dessiner l'image sur la totalité de la surface d'impression
    		int iRatioRes = 1;
    		DEVMODE * pDev = (DEVMODE *)GlobalLock( dialog.GetDevMode());
    		if (pDev->dmFields & DM_ORIENTATION)
    		{
    			pDev->dmOrientation = DMORIENT_LANDSCAPE;
    		}
    		if (pDev->dmFields & DM_YRESOLUTION)
    		{
    			iRatioRes = pDev->dmYResolution / 96;
    		}
    		else
    		{
    			if (pDev->dmFields & DM_PRINTQUALITY)
    			{
    				iRatioRes = pDev->dmPrintQuality / 96;
    			}
    		}
    		GlobalUnlock( dialog.GetDevMode());
     
    		HDC hDCPrinter = dialog.CreatePrinterDC();
     
    		if (hDCPrinter != NULL)
    		{
    			int iTailleX = GetDeviceCaps( hDCPrinter, HORZSIZE);
    			int iTailleY = GetDeviceCaps( hDCPrinter, VERTSIZE);
    			int iResX = GetDeviceCaps( hDCPrinter, HORZRES);
    			int iResY = GetDeviceCaps( hDCPrinter, VERTRES);
    			double dRatioX = (double)iResX / (double)iTailleX;
    			double dRatioY = (double)iResY / (double)iTailleY;
     
    			// Rectangle de la page entière sans marge
    			CRect rcPage(0, 0, iResX, iResY);
    			rcPage.DeflateRect((int)(A2i::eMargeG * dRatioX), (int)(A2i::eMargeH * dRatioY), (int)(A2i::eMargeD * dRatioX), (int)(A2i::eMargeB * dRatioY));
     
    			// Rectangle d'impression
    			CRect rcImp( rcPage.left, rcPage.top, rcPage.right, rcPage.bottom);
     
    			DOCINFO diDocinfo;
    			memset( & diDocinfo, 0, sizeof( diDocinfo));
    			diDocinfo.cbSize = sizeof( diDocinfo);
    			diDocinfo.lpszDocName = m_bkgParams.strChartTitle.c_str();
    			// On démarre l'impression d'un document
    			if (StartDoc( hDCPrinter, & diDocinfo))
    			{
    				CRect rcRect;
    				GetClientRect( rcRect);
    				HDC hdcBitmap = CreateCompatibleDC( hDCPrinter);
    				SelectObject( hdcBitmap, hBmp);
     
    				SetStretchBltMode( hDCPrinter, HALFTONE);
    				StretchBlt( hDCPrinter, rcImp.left, rcImp.top, rcImp.Width(), rcImp.Height(), hdcBitmap, 0, 0, iBmpWidth, iBmpHeight, SRCCOPY);
    				DeleteDC( hdcBitmap);
     
    				EndDoc( hDCPrinter);
    			}
    			else
    			{
    				AbortDoc( hDCPrinter);
    			}
     
    			DeleteDC( hDCPrinter);
    		}
    	}
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Merci pour ton post,

    Losque que j'utilise ton code plusieurs messages d'erreur s'affichent tel que :

    'CPrintDialog' was not declared in this scope

    Cela signifiant surement que certaines bibilotheque sont manquantes, mais etant debutant en c++ et en api windows je n'ai pas trouvé quelles librairies importer dans mon projet. Utilisant QtCreator je ne sais pas si cela est possible .

  9. #9
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Ah en utilisatn QtCreator tu dois avoir à disposition les classes qt te permettant de faire ce que tu veux.
    Le code que j'ai posté nécessite d'utiliser les MFC (couche supplémentaire au dessus de l'API Windows). Il doit y avoir un autre en moyen en passant directement par l'API Windows, mais je ne me suis pas penché dessus.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Finalement, j'ai enfin reussi a imprimer une image en utilisant la bibliotheque Qt ( merci abarral pour ton code qui marche a merveille ) et en le combinant avec l'api windows j'ai eu ce que je voulais .
    Merci beaucoup pour votre aide ,j'en profite pour vous demander si vous aviez une idee sur le fait de capturer une image provenant d'une webcam .

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut !

    Le mieux est de marquer ce topic "Résolu" et d'en ouvrir un nouveau pour la webcam
    Find me on github

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Points : 31
    Points
    31
    Par défaut
    Salut,

    Pour capturer une image avec une web cam, le plus simpe (et de loin) est d'utiliser la librairie OpenCV...

    Le code pour capturer une image en OpenCV est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #include "cv.h"
    #include "highgui.h"
     
    using namespace cv;
     
    int main(int, char**)
    {
        VideoCapture cap(0); // open the default camera
        if(!cap.isOpened())  // check if we succeeded
            return -1;
     
        Mat edges;
        namedWindow("edges",1);
        for(;;)
        {
            Mat frame;
            cap >> frame; // get a new frame from camera
            cvtColor(frame, edges, CV_BGR2GRAY);
            GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
            Canny(edges, edges, 0, 30, 3);
            imshow("edges", edges);
            if(waitKey(30) >= 0) break;
        }
        // the camera will be deinitialized automatically in VideoCapture destructor
        return 0;
    }
    Ce code est un extrait de la documentation d'OpenCV qui se trouve ICI :http://opencv.willowgarage.com/docum...adinvideo.html.
    Un forum consacré à OpenCV se trouve sur developpez.com ici :
    http://www.developpez.net/forums/f73...heques/opencv/

    Cordialement,


    --------------------------------------
    Adrien BARRAL
    REETI's development team
    http://www.reeti.fr

  13. #13
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    C'est même plus simple car le code que tu montres applique un flou de gauss et une détection des contours (canny) sur l'image .

    OpenCV c'est très bien, et en plus la licence permet une utilisation commerciale.
    Find me on github

  14. #14
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Merci a tous
    Je vais donc me pencher vers OpenCV qui a l'air effectivement adapté a mes besoins, je met donc ce topic sur resolu .
    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Imprimer une image avec java
    Par adilou1981 dans le forum Langage
    Réponses: 5
    Dernier message: 04/08/2006, 15h23
  2. imprimer une image dans un fichier
    Par SegmentationFault dans le forum Delphi
    Réponses: 7
    Dernier message: 02/08/2006, 16h04
  3. [FLASH] Imprimer une image chargée dynamiquement
    Par penchu dans le forum Flash
    Réponses: 2
    Dernier message: 04/01/2006, 16h59
  4. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 18h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo