Calcul de taille de texte automatique

Discutez d'informatique ici !
Melopey
Messages: 3
Enregistré le: 23 Oct 2017, 21:39

Calcul de taille de texte automatique

par Melopey » 23 Oct 2017, 22:05

Salut,

J'ai un souci pour trouver un algorithme performant dans le calcul de taille de texte automatique en fonction d'une zone. J'ai déjà codé un algorithme simpliste qui ne me convient pas, car peu performant quand les tailles de polices sont trop grandes comparativement à une petite zone de texte. Mon code est en C# et le calcul de la taille d'un mot est effectué via la bibliothèque GDI+ et prend en moyenne 0,93 ms sur ma machine, un iCore5. Je dois faire tourner mon algorithme sur des dual core datant d'une dizaine d'années.

Je vais expliquer plus clairement le problème : Un texte contenant des tailles de polices différentes, des polices et des styles différents doit s'inscrire dans une zone de texte. Il n'y a pas de longueur limite au texte, les mots ne doivent pas être coupés. Lorsque le texte est trop grand, et pas quand il est plus petit que la zone, l'algorithme doit trouver la taille de texte qui se rapproche le plus de la taille de la zone, sans jamais dépasser ni la largeur, ni la hauteur.

Actuellement, je calcule le texte d'origine pour qu'il se cale en largeur grâce à une fonction récursive qui construit chacune de mes lignes (qui peuvent donc être de taille différentes), puis tant que la hauteur de mon texte n'a pas atteint la hauteur de la zone, je diminue la taille de police de tous les mots de mon texte de 0,5 pixels et le code de calcul de largeur est exécuté. La force de ce code est qu'il est simple et robuste, efficace dans la plupart des cas.

Mes cours de maths sont bien loin, et j'ai recherché quelques algorithmes sur wikipedia sans réussir à établir un lien entre ceux-ci et mon problème...
Avez-vous une idée pour coder cela de manière plus efficiente ?



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 5771
Enregistré le: 22 Nov 2007, 13:00

Re: Calcul de taille de texte automatique

par fatal_error » 23 Oct 2017, 22:57

salut,

à défaut tu peux procéder de manière dichotomique.
tu testes avec une police 1, puis 100 puis ...
et tu check si ton texte fit ou pas.
si oui tu augmentes la police, sinon tu las diminues.

Sinon si tu as besoin d'être plus précis, ca m'a lair suspect: 1ms pour calculer la taille d'un mot... sur 100 mots, ca fait qd même 100ms, c'est énorme!!!
Qd bien même ca veut dire qu'il faut que tu calcules pour une police donnée la largeur de chaque caractère (la connais-tu?) tienne compte de l'interline, etc... (tu t'embarques pas dans la bonne direction à mon avis)
Surtout si tu fais du csharp c'est un peu pour pas mettre les mains dans ce genre de cambouï
la vie est une fête :)

Melopey
Messages: 3
Enregistré le: 23 Oct 2017, 21:39

Re: Calcul de taille de texte automatique

par Melopey » 24 Oct 2017, 00:58

J'ai déjà testé la dichotomie, c'est moins performant que l'algo simpliste dans la plupart des cas qui seront traités, car la police est à peu près réglée au départ, dans la plupart des cas.
J'utilise la dll C++, GDI+ car c'est beaucoup plus précis, Graphics.MeasureString ajoute plusieurs pixels en plus, apparemment à cause de l'anti aliasing. Quand un texte est centré à la base, il est décalé. Je vais quand même vérifier les temps de traitement pour la méthode C# et réajuster le centrage si celle-ci s'avère plus efficace.
Et puis, c'est pour modifier des fichiers SVG, donc rien à voir avec les winforms ou ce genre de choses, et comme c'est du vectoriel, le moindre pixel décalé peut tout de suite prendre des proportions énormes selon la résolution.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 5771
Enregistré le: 22 Nov 2007, 13:00

Re: Calcul de taille de texte automatique

par fatal_error » 24 Oct 2017, 09:06

deux nouvelles idées de fait pour ma part:
1 - tjs par rapport à l'approche dichotomique c'est qu'un exemple.
1.1 Rien ne t'empêches de détecter quand les polices sont grosses et changer ton -0.5,-0.5,-... par une approche dichot
1.2 Tu peux aussi __adapter__ ta réduction de fontsize en fonction de l'écart par rapport à la hauteur désirée:
idem tu mets
pas = 0.5
while( z < text.height() )
oldth = text.height()
text.fontSize -= pas
th = text.height()
pas =(z-th) * pas / (th-oldth)
//si 0.5 menleve 30px, 1 menleve "a priori (c'est faux mais on approx) 60px",
//pr enlever R px (les px restants), produit en croix:
//pas=>30px
//newpas => R => newpas = R*pas/30

2)
a mon avis on peut sen sortir à l'aide de calcul d'interlignes https://developer.mozilla.org/en-US/doc ... ine-height
en calculant pour chaque ligne la taille de l'interligne mais il faudrait que tu précises...si lutilisateur peut la modifier etc.
Dans tous les cas, je tendrais à renforcer l'approche 1 plutot que 2 (même si 2 est puls instructive...)
la vie est une fête :)

Melopey
Messages: 3
Enregistré le: 23 Oct 2017, 21:39

Re: Calcul de taille de texte automatique

par Melopey » 24 Oct 2017, 12:03

Ok merci, je vais tester l'approche 1, en détectant les tailles de polices et en adaptant le pas. Sachant que le nombre de lignes varie avec le changements de police, ça reste quand même compliqué pour réaliser l'approche 1.2. Par exemple avec une police 100 j'ai 15 lignes qui s'inscrivent dans la largeur de la zone, et avec une police 30, je vais en avoir 5, la taille du texte proportionnellement passe donc facilement du simple au double.
La deuxième me semble compliquée à réaliser, puisque je n'ai pas accès facilement à la propriété line-height, et une ligne peut avoir une taille différente si un seul mot est plus grand.
J'ai vérifié les perfs avec GDI et avec Graphics.MeasureString. Avec GDI, je suis passée à 0,023ms pour un mot, j'instanciais et libérais trop d'objets pour un seul mot, quant à Graphics.MeasureString, c'est 0,001ms. Les performances s'en ressentent grandement. Je dois maintenant tester la qualité d'affichage avec Graphics.MeasureString et voir les adaptations à réaliser.
Je pensais pouvoir trouver une fonction avec une dérivée qui tende vers la taille que je souhaite obtenir, mais ça parait difficile.
En tout cas, merci de ton aide !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 5771
Enregistré le: 22 Nov 2007, 13:00

Re: Calcul de taille de texte automatique

par fatal_error » 24 Oct 2017, 19:44

cqui me dérange un peu c'est que par ex en css, il y a le word-wrap pour aller à la ligne si un mot devait être coupé. Et du coup, il n'y a plus qu'à récupérer la hauteur

donc 1: déjà si tu peux te priver de ton calcul de largeur qui est probablement couteux (je sais pas à quel point tu l'as pas dit) et te servir d'un call API je pense que tu y gagnes grandement (par ex tu plotes dans un textform (ou un truc similaire qui supporte le wordwrap et une largeur imposée) non visible ou qqch du genre...parce que le redraw ca coute)

puis 2: combien coute le total de modifier (fontsize+mesurer texte) à priori par dichotomie ca fait 7 étapes..
la vie est une fête :)

J3r3mY
Messages: 5
Enregistré le: 31 Juil 2017, 16:53

Re: Calcul de taille de texte automatique

par J3r3mY » 14 Nov 2017, 14:49

Bonjour,

Je suppose avoir compris le problème et j'ai une solution d'une simplicité infantile a proposer répondant à la formulation que je me suis fait de ton problème:
tu as un texte avec des ensemble de caractères hétérogène qui a une aire variable en fonction de la hauteur et la largeur du conteneur de base et qui doit être redimensionné par rapport à un conteneur final avec une hauteur et une largeur variable. est-ce correct ?

Si oui, à ta place, je redimensionnerais le conteneur de base pour qu'il soit proportionnel au conteneur final en largeur ou en hauteur et resizer le texte en multipliant sa taille par le coef. de proportionnalité (le formatage de base sera le même que le formatage final du texte)

Si la proportion se fait sur la largeur : il faudra prévoir une marge "vide" en haut ou en bas ou les deux.
Si la proportion se fait sur la haute : il faudra prévoir une marge "vide" a gauche ou a droite ou les deux.

J'espère avoir compris le problème et y avoir répondu correctement...

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : ortollj et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite