Taille de texte différentes selon canvas ou tBitmap

Résolu
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 - 18 juil. 2006 à 17:27
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 - 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

9 réponses

ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
19 juil. 2006 à 11:15
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
3
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
19 juil. 2006 à 15:15
Pas de quoi.

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

Bonne prog

Thierry
3
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
18 juil. 2006 à 19:10
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
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
19 juil. 2006 à 09:27
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
19 juil. 2006 à 12:29
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
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
19 juil. 2006 à 13:06
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
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
19 juil. 2006 à 14:11
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
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
19 juil. 2006 à 14:46
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
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
19 juil. 2006 à 15:04
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
0
Rejoignez-nous