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 :

Imprimer un bitmap


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Points : 76
    Points
    76
    Par défaut Imprimer un bitmap
    Bonjour

    Je souhaite extraire une region d'un bitmap pour la "strecher" dans le canvas de l'imprimante. J'utilise donc le 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
     
    var source : TBitmap;
        BitmapHeader:  pBitmapInfo;
        BitmapImage :  POINTER;
        HeaderSize  :  LONGWORD;
        ImageSize   :  LONGWORD;
     
    begin
     try
      source:=TBitmap.Create;
      source.HandleType:= bmDIB;
     
      source.LoadFromFile('C:\mon bitmap.bmp');
      source.PixelFormat:= pf24Bit;
     
      Printer.BeginDoc;
     
      GetDIBSizes(source.Handle, HeaderSize, ImageSize);
      GetMem(BitmapHeader, HeaderSize);
      GetMem(BitmapImage,  ImageSize);
      try
       GetDIB(source.Handle, source.Palette, BitmapHeader^, BitmapImage^);
     
       Printer.Canvas.Lock;
     
       SetStretchBltMode(Printer.Canvas.Handle,HALFTONE);
     
       StretchDIBits(Printer.canvas.Handle,
                     0, 0,                                  
                     Printer.PageWidth,                    
                     Printer.PageHeight,   
                     0, 0,                           
                     source.Width, source.Height,   
                     BitmapImage,
                     TBitmapInfo(BitmapHeader^),
                     DIB_RGB_COLORS,
                     SRCCOPY);
     
       Printer.Canvas.Unlock;
     
       Pinter.EndDoc;
     
      finally
       FreeMem(BitmapHeader);
       FreeMem(BitmapImage)
      end;
     
     finally
      source.Free;
     end;
    Et là rien ne se produit : une page vide, blanche ! Par contre si je supprime la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetStretchBltMode(Printer.Canvas.Handle,HALFTONE);
    là la page est bien remplie mais le résultat est décevant.

    J'ai fais la même expérience avec le canvas d'un bitmap que je sauvegarde dans un fichier et même résultat. Donc j'en déduis que ce n'est pas un problème d'imprimante puisque ça le fait aussi sur un canvas de bitmap.

    Comment faire pour extraire une portion d'image et l'étirer dans un canevas sans dégradation d'image ?

    Si je teste avec 300 ppp (un canvas de 3389x2380 en mode paysage) cela fonctionne. En revanche avec du 600 ppp (un canvas de 6778x4760) le problème apparaît.

    Quelqu'un a-t-il une idée ?

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    La Déformation d'Image des API Windows, c'est la même que dans Paint ... donc ça bave ... essaye la lib Graphics32 (Gr32), elle doit proposer un étirement plus "lisse"

  3. #3
    Membre régulier Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Points : 76
    Points
    76
    Par défaut
    lib Graphics32 ne propose que des fonctions pour écrire sur du TBitmap32...

    moi je cherche un moyen pour transférer une partie de mon bitmap sur le canvas cible en l'étirant

  4. #4
    Membre régulier Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Points : 76
    Points
    76
    Par défaut
    Personne n'imprime donc de belles images pleine page avec Delphi alors ?

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 380
    Points
    15 380
    Par défaut
    Citation Envoyé par ALEX77 Voir le message
    Personne n'imprime donc de belles images pleine page avec Delphi alors ?
    Moi pas.
    Ceci dit, tu n'incites pas à réfléchir :
    (...) là la page est bien remplie mais le résultat est décevant.
    C'est quoi, décevant ?
    Pixellisé ? Proportions pas respectées ? Il en manque ? ... ?
    Ça donnerait une direction vers où réfléchir, parce que là c'est un peu vague, non ?
    --
    jp

  6. #6
    Membre régulier Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Points : 76
    Points
    76
    Par défaut
    Salut jipété

    En fait j'ai fait un essai avec ce fragment de code ci-dessus avec deux imprimantes :

    -une HP LaserJet 6L (monochrome 600 ppp)
    -une Canon MP780 (600 ppp)

    Le résultat est étrange : sur la Canon la page s'imprime correctement -> tant mieux !

    Par contre sur la HP ça fonctionne si je passe la résolution de l'imprimante en qualité brouillon 300 ppp. En 600 ppp ça n'imprime pas toute la page et on peu voir une rayure blanche fendre la page.

    Donc d'une part ce qui est décevant car je n'ai aucune certitude que mon code fonctionnera sur d'autres imprimantes "un peu trop anciennes" (?). Et d'autre part, il semblerait que je ne puisse pas utiliser HALFTONE pour améliorer le stretch...

    Par ailleurs pour ceux que ça intéresse je suis tombé là dessus : http://www.code4sale.com/joehecht/prndib.htm

    Pas encore testé pour le moment mais d'après ce qui est dit, je n'est pas un problème d'imprimante

Discussions similaires

  1. "Imprimer" un Graphics dans un Bitmap
    Par PerpetualSnow dans le forum Windows Forms
    Réponses: 0
    Dernier message: 05/11/2008, 16h43
  2. Imprimer une bitmap en .NET 2
    Par AkH dans le forum C#
    Réponses: 2
    Dernier message: 14/08/2007, 12h23
  3. Imprimer dans un bitmap
    Par Toine dans le forum Delphi
    Réponses: 2
    Dernier message: 09/03/2007, 13h02
  4. [BP]Imprimer un bitmap à tous les coups
    Par mennix dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 28/01/2004, 19h42
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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