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

 Delphi Discussion :

[D7] Redimensionner correctement un BMP à l'impression


Sujet :

Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut [D7] Redimensionner correctement un BMP à l'impression
    Bonjour

    Ça fait un certain moment que je tente et me pose des questions quant au comment respecter la proportionnalité de la dimension du BMP à l'impression

    Tout est ok sur des images carrées, mais dès que ça devient allongé ; à l'impression c'est légèrement rétrécit

    J'ai écumé des tas de sites et codes, mais ça revient toujours au même.

    J'ai même soupçonné que ça venait de mon écran assez allongé, mais non car j'ai testé sur un autre plus au carré.

    Sur un site US, je me suis arrêté sur ce code qui semble t'il devrait être pertinent, via un rééchantillonnage BMP et par conséquent m'aider.

    Manque de chance, ça plante sur un ligne, et là je suis bloqué :

    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
    // USES : JclGraphics
    procedure PrintGraphic(source: TGraphic);
    var
      dest: TBitmap;
      destWidth, destHeight,
      printerPixelsPerInch_X, printerPixelsPerInch_Y,
      printerLeftMargin, printerTopMargin: integer;
    begin
      printerPixelsPerInch_X := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
      printerPixelsPerInch_Y := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
      printerLeftMargin      := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
      printerTopMargin       := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
    
      dest := TBitmap.Create;
      try
        destWidth  := source.Width  * printerPixelsPerInch_X div Screen.PixelsPerInch;  // ligne plantage
        destHeight := source.Height * printerPixelsPerInch_Y div Screen.PixelsPerInch;
    
        Stretch(destWidth, destHeight, rfLanczos3, 0, source, dest);
    
        Printer.BeginDoc;
        try
          Printer.Canvas.Draw(printerLeftMargin, printerTopMargin, dest);
          Printer.EndDoc;
        except
          Printer.Abort;
          raise;
        end;
      finally
        dest.Free;
      end;
    end;
       
    
    procedure TForm1.btnPrintClick(Sender: TObject);
    begin
      if not PrinterSetupDialog.Execute then exit;
      PrintGraphic(Image.Picture.Graphic);
    end;
    Merci d'avance de vos idées, ou autres méthodes,

    DS7

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 456
    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 456
    Points : 24 868
    Points
    24 868
    Par défaut
    Plantage ? une Erreur ? une Exception ?

    pense que Screen.PixelsPerInch c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      var DC: HDC = GetDC(0);
      FPixelsPerInch := GetDeviceCaps(DC, LOGPIXELSY);
      ReleaseDC(0, DC);
    Cela doit être 96 à chaque fois, c'est devenu complètement factice comme valeur
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Stéphane

    Le message d'erreur est celui-ci :

    ---------------------------
    Notification d'une exception du débogueur
    ---------------------------
    Le projet xxx.exe a provoqué une classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse 00491520 dans le module 'xxx.exe'. Lecture de l'adresse 00000000'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    Edit :
    J'ai modifié les deux lignes en question par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        destWidth  := source.Width  * printerPixelsPerInch_X div 96;  // ligne plantage
        destHeight := source.Height * printerPixelsPerInch_Y div 96;
    Mais c'est pareil ; ça ne change rien.

    DS7

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 456
    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 456
    Points : 24 868
    Points
    24 868
    Par défaut
    source n'est pas à nil ?
    Surtout que 00000000 c'est curieux, on a plutôt une adresse avec un léger décalage de l'adresse des propriétés Heigth et Width
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Mauvaise pioche


    Peut-être ce code n'est pas si fiable, en plus il stipule d'avoir la librairie JVCL, oui je l'ai mais si un jour je modifie mon environnement, je ne sais pas si elle suivra. Quoique j'y tiens beaucoup.

    Les copains, bref, ne vous cassez pas la tête sur ce coup, en plus le code au final se base sur le TImage, qui selon moi confirme le bancalisme du topo.

    Je considère ce thread comme résolu par défaut de combattants

    Merci encore à Stéphane,

    DS7

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

Discussions similaires

  1. [AC-2007] Redimensionnement d'un formulaire à l'impression
    Par STOUPI dans le forum Access
    Réponses: 1
    Dernier message: 23/11/2015, 23h19
  2. Exporter une form en Bmp ET Impression
    Par Baxter67 dans le forum C++Builder
    Réponses: 20
    Dernier message: 03/03/2008, 09h04
  3. [Lazarus] Redimensionner une image bmp
    Par lohot dans le forum Lazarus
    Réponses: 2
    Dernier message: 09/02/2007, 12h58
  4. Redimensionnement d'image BMP
    Par leonberg dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 14/09/2006, 09h03
  5. Impression d'image bmp
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 18/07/2002, 09h38

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