Taille de texte différentes selon canvas ou tBitmap [Résolu]

cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 18 juil. 2006 à 17:27 - Dernière réponse : ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention
- 19 juil. 2006 à 15:15
Bonjour à tous,

Je me suis construit un espece d'aperçu avant impression sur un tBitmap (de même taille que le résultat final sur l'imprimante: 1 pixel=1 ppp) ou il est possible de changer la taille des textes.
Selon cette taille, j'utilise:
http://delphi.developpez.com/faq/?pa...imensionstexte
Pour obtenir la taille en pixels et centrer le texte selon les nouvelles informations.

Seulement, lorsque j'imprime ces élements à l'aide du canvas de l'imprimante, le texte (qui a gardé ses même propriétés) apparait plus gros.

En clair, quand au pré-rendu, mon texte fait la même taille que d'autres element (images, traits, ...), il apparait beaucoup plus gros à l'impression !

Par exemple, si je fait (avec la même font, bien entendu):
monTBitmap32.Textout(20,20,'TEST');
sur un tBitmap32 de 600*400, le résultat prendra moins de place que:
Printer.canevas.Textout(20,20,'TEST');
imprimé sur une étiquette de 75*50 en 203 dpi (donc 600*400 pixels).
<!-- / message --><!-- sig -->

Qu'est ce qui se passe ?

<!-- / message -->
<!-- sig -->



[;)] David, à VERSAILLES
Afficher la suite 

10 réponses

Répondre au sujet
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 19 juil. 2006 à 11:15
+3
Utile
Bonjour David,

Ok pour 600p = 75mm en 203dpi.
En fait, on ne fait pas un StretchDraw du texte, mais on écrit sur le bitmap en tenant compte de la résolution imprimante.

Pour récupérer le nb de pixels/pouce de l'imprimante :
   P := GetDeviceCaps(Printer.handle, LOGPIXELSX);

Dans ta procedure de texte sur le bitmap :
   with mybitmap do
   begin
       // on donne à la fonte écran la résolution de l'imprimante
       Canvas.Font.PixelsPerInch := P;
       Canvas.TextOut........
   end;

A +
Thierry
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ThWilliam
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 19 juil. 2006 à 15:15
+3
Utile
Pas de quoi.

Petite correction dans le code :
   Canvas.Font.Assign(elt.police)  //distraction de ma part !!!

Bonne prog

Thierry
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ThWilliam
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 18 juil. 2006 à 19:10
0
Utile
Salut nitrique.

Ce n'est pas pcq tu imprimes 600 pixels sur une largeur de 75mm que tu travailles en 203 dpi !
En fait, tu travailles avec la résolution de ton imprimante (impri bureau: généralement 300 ou 600 dpi). Donc une ligne de 600 pixels  en 300dpi 2" imprimé (soit 2 * 25,4 50,8 mm) et la même ligne en 600dpi = 1".
Si je fais Printer.Canvas.TextOut(300,300, 'TEST') : avec une résolution impri de 300 dpi, j'aurai une marge de 1", avec une résolution de 600dpi, une marge de 1/2", mais la taille de mon texte reste identique pcq la fonte s'adapte à la résolution imprimante.
Pour faire un aperçu avant impression, il te faut dessiner dans un canvas qui ait la taille en pixels de la page à imprimer compte tenu de la résolution impri employée.
Après, tu fais un StretchDraw de ce bitmap en conservant les proportions.

Excellent tutoriel : http://delphi.developpez.com/cours/?dom=IMPRESSION
L'aperçu avant impression se fait avec un MetaFile dessiné dans un PaintBox, ce qui est beaucoup plus net à l'écran qu'un TBitmap.

A +
Thierry
Commenter la réponse de ThWilliam
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 19 juil. 2006 à 09:27
0
Utile
Bonjour Thierry,

Mon imprimante est bien en 203 dpi (c'est une imprimante étiquettes).
Donc, je ne pense pas me tromper en disant que 600 pixels=75mm sur papier.
Ce qui est à l'ecran doit être, par consequent, la même chose qu'au rendu, nan ?

Je vais étudier le lien que tu m'as passé, merci.
Si j'utilise un tBitmap32 (composants graphics32), c'est pour pouvoir utiliser des calques et les déplacer/redimensionner/supprimer à l'ecran.

Peux tu STP, me donner un rapide exemple pour afficher du texte avec StretchDraw ?

David, à VERSAILLES
Commenter la réponse de cs_nitrique
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 19 juil. 2006 à 12:29
0
Utile
Excellent, je te remercie mille fois ! (si, si...)
En fait, c'était tout bête... Fallait jouer avec PixelsPerInch.

Je n'y avais pas pensé (et ne connaissait pas trop d'ailleurs).

Pour l'impression, ça marche nickel, par contre, lorsque je recharge mon tBitmap, il me divize à chaque fois la taille du texte par 2 ???

[;)] David, à VERSAILLES
Commenter la réponse de cs_nitrique
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 19 juil. 2006 à 13:06
0
Utile
Désolé David, mais je ne comprends pas ton problème : "lorsque je recharge mon tBitmap, il me divise à chaque fois la taille du texte par 2".
Peux-tu être plus explicite et montrer quelques lignes de code ?
Remarque : tu utilises un TBitmap32, je connais graphics32 de nom, mais je n'ai jamais utilisé.

A +
Thierry
Commenter la réponse de ThWilliam
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 19 juil. 2006 à 14:00
0
Utile
Le TBitmap32 est comme un TBitmap standard en gros.

Voici comment je procède:

Je crée un calque texte (à l'aide d'un tFontDialog) que je pose sur mon tImageView32 de cette manière:
      var texte: String; // Texte à afficher
            elt: tElement; // Structure

      elt.police := TFont.Create; // police est un tFont
      elt.police.Assign(fdMain.Font);
      Buffer.Font := elt.police; // Buffer est le TBitmap32 de mon imageView32
      Buffer.Textout(Floor(Left),Ceil(Top),elt.texte);
(Par défaut, il met le PixelsPerInch à 96)

J'utilise ensuite http://www.delphifr.com/infomsg_ENREGISTRER-POLICE-VARIABLE-TFONT-DANS-FICHIER-INI_385402.aspx pour sauvegarder mon etat lorsque je le ferme.

Et lorsque je le réouvre, je charge la font depuis le texte et je rajoute le PixelsPerInch à ce moment.
Seulement, le fait de rajouter ça, ça fait diviser le size du texte par 2 (à peu près).

David, à VERSAILLES
Commenter la réponse de cs_nitrique
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 19 juil. 2006 à 14:11
0
Utile
Suite à quelques tests en moide débug, je me suis aperçu de ça:

elt.police := TFont.Create; // Debug: elt.police.size=8 (par défaut)
elt.police.Assign(fdMain.Font); // Debug: elt.police.size=28 (ce que moi j'ai mis)
elt.police.PixelsPerInch := prmImpResol; // Debug: elt.police.size=13 (il le change tout seul)

[;)] David, à VERSAILLES
Commenter la réponse de cs_nitrique
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 19 juil. 2006 à 14:46
0
Utile
Font.Size = 28
Font.PixelsPerInch = 203
d'où Font.Size devient : 28 * (96/203) = 13
Quand tu sauvegardes ta Font, tu sauvegardes size = 13
D'où quand tu récupères et que tu refais un PixelsPerInch, cela donne :
  size =  13 * (96/203) = 6.
Il te faut donc sauvegarder Font.Size dans la résolution écran (28)
Ou alors tu emploies:
   Canvas.Assign(elt.police)
   Canvas. Font.PixelsPerInch = ...
ce qui ne modifie pas les propriétés de elt.police

A +
Thierry
Commenter la réponse de ThWilliam
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 19 juil. 2006 à 15:04
0
Utile
Ok, j'ai réussi à faire fonctionner le truc d'une autre manière:
Je ne modifie lePixelsPerInch que lorsque je construit mon texte sur le canvas de l'imprimante... Sur mon tImageView32, je laisse tout par défaut.
Ca marche assez bien et c'est fidèle... ...Si j'imprime sur une autre imprimante qui est en 600 dpi, ça marche aussi.

Je garde néanmoins tes solutions sous le coude au cas ou je m'aperçoit d'un cas ou ça ne marche pas.

Je te remercie une fois encore (ça fait mille et une, hi).

David, à VERSAILLES
Commenter la réponse de cs_nitrique

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.