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

Langage Delphi Discussion :

Problème d'impression de Bitmap


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 19
    Par défaut Problème d'impression de Bitmap
    Le code ci-dessous ne fonctionne que sur certaines imprimantes. Quelqu'un peut-il déceler pourquoi? Je veux imprimer une fenetre d'un fichier-rasteur de grande taille (12289*8880 pixels)

    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
     
    -------------------------------------------------------------------
    implementation
    uses printers;
     
    procedure PrintPrinterWindow;
    var
        Bitmap : TBitMap; // BitMap intermédiaire
    begin
     
        Bitmap := TBitmap.Create;
        Bitmap.canvas.CopyMode := cmSrcCopy;
        Bitmap.Width  := PrintVueWidth;
        Bitmap.Height := PrintVueHeight;
     
        // Copie dans le bitmap intermédiaire
        Bitmap.Canvas.CopyRect(
            // Rectangle de destination
            Rect(0,0,Bitmap.Width,Bitmap.Height),
            // Canevas d'origine: (le raster)
            PlanRaster.Bitmap.Canvas,
            // Rectangle du canevas d'origine à tracer dans le rectangle de destination:
            Rect(PrintVueLeft,PrintVueTop,PrintVueWidth+PrintVueLeft,PrintVueHeight+PrintVueTop));
     
        Printer.orientation := poPortrait;
        Printer.BeginDoc;
    try
            // copie dans le canvas imprimante
     
    { Ne marche que sur certaines imprimantes...???
            Printer.Canvas.CopyRect(
                // Rectangle de destination (canevas imprimante)
                Rect(PixMargeGauche,PixMargeHaute,PixFenWidth+PixMargeGauche,PixFenHeight+PixMargeHaute),
                // Canevas d'origine
                Bitmap.Canvas,
                // Rectangle du canevas d'origine à tracer
                Rect(0,0,Bitmap.Width,Bitmap.Height));
    }
     
            Printer.Canvas.StretchDraw({ idem CopyRect: Ne marche que sur certaines imprimantes...???}
                // Rectangle de destination (canevas imprimante)
                Rect(PixMargeGauche,PixMargeHaute,PixFenWidth+PixMargeGauche,PixFenHeight+PixMargeHaute),
                Bitmap );
     
    finally
        Printer.EndDoc;
        Bitmap.Free;
    end;
     
    end;

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Le code ci-dessous ne marche que sur certaines imprimantes
    Et quand il ne fonctionne (ce sont les humains qui marchent...) pas, il fait quoi (where is my boule of cristal...) ?

    Par ailleurs, ça serait cool que tu reprennes ton post ("éditer"), que tu sélectionnes ton code et que tu lui appliques la balise "code" (celle avec le dièse [#]), parce que là, c'est passablement indigeste. Merci.

    --
    jp

  3. #3
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Non, ce code fonctionne sur toutes les imprimantes (si, si...).

    Maintenant, ça ne fait pas ce que tu veux sur toutes les imprimantes.
    Pour que l'on puisse t'aider, il faudrais que tu expliques ce qui cloche : image trop petite ? Bordure d'image rognée ? Image mal centrée ? tout ça à la fois ?

    Edit : c'est bien cow-boy, tu dégaines vite

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 19
    Par défaut
    Ce code fonctionne très bien sur certaines imprimantes, et ne donne rien sur d'autres. Du blanc, quoi. (si le papier n'est pas trop sale)

  5. #5
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Question comme ça : pourquoi passes tu par un bitmap intermédiaire ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 19
    Par défaut
    Je passe par un bitmap intermédiaire, car j'avais pensé que le pb venait d'un pb de résolution ou de taille de bitmap. Cet intermédiaire servait à diviser par deux la résolution, mais ca n'a rien donné de probant, alors je l'ai remis taille 1.
    En tout cas, je pense que le pb ne vient pas de lui.

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Ce code marche très bien sur certaines imprimantes, et ne donne rien sur d'autres.
    Question : tu as plusieurs imprimantes sur ta machine, pour tester ?
    Ou bien tu trimballes ton exe de machine en machine, et selon le cas ça fonctionne (si si, j'insiste ! d'accord, c'est plus long à taper...) ou pas ?

    Par ailleurs, on dirait qu'il n'y a pas de manière de sélectionner le printer qui sera utilisé (enfin, y a p'têt pas tout).
    Plus un pb d'environnement que de code, on dirait...
    --
    jp

  8. #8
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Bon, Ce que j'entrevois à première vue...
    c'est que ça imprime quelque chose de tellement petit sur ta page que tu ne le vois pas. Si sur ta feuille tu réussi à apercevoir une tâche d'encre, c'est que c'est ça...

    C'est du à la résolution du canevas de l'imprimante

    Là, tout de suite, si je regarde les la résolution de mon imprimante, c'est : 29700x21000.

    Enfin bon 1200 dpi, c'est 12000 pts par tranche de 2,54 cm....

    si ton bitmap fait 800x600 comme sur ton écran, imagines la taille de ton image sur le canevas de ton imprimante.

    Donc normalement, tu devrais pouvoir coller ton raster directement sur l'imprimante...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 19
    Par défaut
    Mon pb c'est que ça a fonctionné sur toutes les imprimantes que j'ai testé. Mais certaines personnes qui utilisent des grosses imprimantes de bureau, m'ont signalé cette absence de bitmap. Pour être complet, je dois dire que l'impression de textes d'habillage fonctionne dans tous les cas.

    Bon, voici du code complémentaire pour essayer de comprendre, mais ce code , je l'ai retourné plusieurs fois dans tous les sens sans succès.
    En développant mon appli, j'avais constaté un pb lié au rapport entre la taille du bitmap et la taille de la fenêtre à l'écran. L'image ne s'affichait pas dans tous les cas en fonction du zoom. On m'avait parlé d'un bug windows à l'époque (c'était sous w98) mais là je suis sous XP. Comprenne qui pourra...


    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
     
    procedure PresentePrinterWindow;
    begin 
            // COPIER DANS UNE FENÊTRE PROPORTIONELLE
            ImagePlan.Canvas.CopyRect(
            ImagePlan.ClientRect,
            PlanRaster.Bitmap.Canvas,
            Rect(VueLeft,VueTop,VueWidth+VueLeft,VueHeight+VueTop));
            EdEche.text := IntToStr(round( RasterScale*CoefEch/VueScale));
     
        // Raster->Ecran
        // fenêtre imprimante dans le Raster
        PrintVueWidth  := round(FenWidth*mmResolution * CoefEch/(VueScale*1000));
        PrintVueHeight := round(FenHeight*mmResolution * CoefEch/(VueScale*1000));
        PrintVueLeft := round(VueLeft+VueWidth/2 - (PrintVueWidth/2));
        PrintVueTop  := round(VueTop+VueHeight/2 - (PrintVueHeight/2));
     
        Form1.ImagePlan.canvas.Rectangle(
        round((PrintVueLeft-VueLeft)*VueScale),
        round((PrintVueTop-VueTop)*VueScale),
        round((PrintVueLeft-VueLeft+PrintVueWidth)*VueScale),
        round((PrintVueTop-VueTop+PrintVueHeight)*VueScale));
    end;
     
    function mm2pr(mm:double):integer;
    begin
        result := MulDiv(PrPPI, round(10*mm), 254);
    end;
     
    Function AppercuPrinterWindow: boolean;
    begin
      result := Form1.PrintDialog1.execute;
      if result then begin
     
        Cap  := GetDeviceCaps(Printer.Handle, TECHNOLOGY);
        if Cap <> DT_RASPRINTER	then begin
            showmessage ('Imprimante non graphique !');
            result := false;
            exit;
        end;
     
        prPPI:=GetDeviceCaps(Printer.Handle, LOGPIXELSX); // Nb de pixels par pouce
     
        // fenêtre imprimante en pixels imprimante
        PixMargeGauche := mm2pr(MargeGauche);
        PixMargeHaute  := mm2pr(MargeHaute);
        PixFenWidth    := mm2pr(FenWidth);
        PixFenHeight   := mm2pr(FenHeight);
      end;
    end;

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

Discussions similaires

  1. Encore Problème d'impression d'un Bitmap
    Par dede92 dans le forum Windows
    Réponses: 0
    Dernier message: 18/04/2008, 19h35
  2. Problème d'impression d'un Bitmap reconstitué
    Par dede92 dans le forum Windows
    Réponses: 8
    Dernier message: 16/04/2008, 18h59
  3. Réponses: 16
    Dernier message: 17/03/2005, 13h54
  4. [Rave] problème d'impression
    Par romstarr dans le forum Rave
    Réponses: 2
    Dernier message: 09/06/2004, 15h48
  5. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37

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