PDA

Visualizza la versione completa : Determinare la lunghezza in pixel di un testo


MARTEDI
26-09-2006, 18:58
esiste una funzione o un modulo che avendo come dati:
- il tipo di testo utilizzato,
- la dimesnione (size),
- ed il testo
mi restituisce la lunghezza in pixel del testo?

Mich_
27-09-2006, 09:06
Lato server non e` possibile determinarlo.
In particolare non hai controllo sulle dimensioni della finestra e neppure sulle dimensioni del font.

Lato client e` possibile fare qualcosa in JS, dopo che il blocco e` stato visualizzato nel browser (eventualemnte anche in un blocco nascosto, se questo e` coperto da un altro blocco).

Ma tornando alla domanda: a che ti serve?
Non e` meglio lasciar fare al browser, ed usare i CSS in modo intelligente?

MARTEDI
27-09-2006, 17:06
ok: sto generando con perl il disegno di un pezzo meccanico in SVG.
Le misure del pezzo meccanico variano, e io devo inserire le quote.
So qual'è il testo che devo scrivere (non lo ricevo da form).
Il problema sta nel fatto che per inserire un testo in SVG devo dare come quota la X e la Y del punto in basso a sinistra.
Vorrei centrare la scritta, quindi se sapessi qual'è la lunghezza del testo in pixel potrei farlo.
Al momento sto risolvendo il problema utilizzando il courier (le lettere hanno la stessa larghezza), ma mi piacerebbe trovare una soluzione alternativa differente per esempio da quella di creare un array con la larghezza delle lettere (sulla base del font utilizzato) che ho trovato in javascript (gestibile fra l'altro anche in perl)

Mich_
27-09-2006, 17:22
Cioe` stai dicendo che vuoi realizzare un disegno in SVG e scriverci sopra (o vicino) delle scritte in HTML?
Mi sembra demenziale.
Fai tutto in SVG! E allora SVG gestisce tutto, compreso la misura dei caratteri.

Ma allora il posto in cui chiedere e` il forum di Flash (o altro sw che gestisce il SVG).

MARTEDI
27-09-2006, 18:41
il mio disegno meccanico cambia dimensioni sulla base di una elaborazione perl (il cliente imposta dei dati, perl li elabora e genera il disegno con le quote).
Le scritte che inserisco nel disegno SVG sono di tipo SVG e vengono impostate da perl.
SVG gestisce la posizione di una scritta indicando l'angolo estremo sinistro.
Se esistesse un modulo perl o una funzione perl (cosa che ora non credo) in grado di calcolare la larghezza della scritta, sempre tramite perl potrei centrare la quota rispetto ad un punto).
Ribadisco, ora già lo sto facendo ma uso il carattere courier in quanto le lettere sono della stessa larghezza:

my $pixel_singolo_carattere=8; #8 se font-size=12
my $scritta;
my $nr_caratteri=length $scritta;

my $larghezza_in_pixel=$nr_caratteri*$pixel_singolo_c arattere;

Mich_
28-09-2006, 09:34
Per fare una funzione in Perl che calcoli la larghezza di una scritta in base al font usato e conoscendo le larghezze dei singoli caratteri, non e` una cosa troppo complessa: ti basta avere un database delle varie larghezze dei caratteri e moltiplicarla per un fattore che dipende sia dal font che dalla dimensione.

Il database e il (o i) fattori di scala non dipendono da Perl, ma dallo strumento con cui esegui la visualizzazione.
Puoi avere due casi:
- il SVG ha una funzione che ritorna la dimensione (e allora devi solo fare la query al SVG)
- il SVG non ha tale funzione, e quindi devi copiarti il database e i fattori (dovresti trovare info nelle specifiche del SVG).

Gli esperti di SVG potrebbero conoscere qualcosa: sicuramente non lo sanno gli esperti di Perl.

MARTEDI
29-09-2006, 17:36
Se si dispone del file NOME_FONT.afm (per chi usa php nelle librerie ce ne sono già molti) del font è possibile usare il seguente modulo già presente nella libreria standard:

use Font::AFM;
$h = new Font::AFM "Helvetica";
$testo="MARTEDI";
$w = $h->stringwidth("MARTEDI", 14); #14 rappresenta l'altezza in pixel (font-size)
print "$w\n"; #$w è la larghezza

nella stessa cartella che contiene questo file ho messo helvetica.afm
Il risultato è ottimo e può servire anche per altre applicazioni grafiche.

MARTEDI
29-09-2006, 19:14
.afm sono file di Adobe che gestiscono la metrica dei font (sono quindi dei piccoli database testuali, quelli appunto indicati da Mich)

Java e C# hanno qualche proprietà in più tramite la gestione delle API (solo per ambienti Windows).

Queste funzioni possono essere richiamate anche dal modulo Perl Win32::GUI
es:

use Win32::GUI;
$testo="parola";
($w, $h) = new Win32::GUI::GetTextExtentPoint32([FONT], $testo);

la larghezza che da come risultato è la stessa che darebbe su una interfaccia GUI.
(A dire il vero non ha funzionato molto bene!)
In ogni caso che si utilizzi una GUI particolare o un programma grafico, i pixel rimangono sempre tali.
Ho escluso questa soluzione poichè funziona solo su ambiente windows ed è più complicato gestire l'impostazione del font (font-size)

Loading