[PHP] imageftbbox lijkt verkeerde waardes terug te geven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bjornski
  • Registratie: September 2002
  • Laatst online: 29-07 14:59
Ik ben bezig een simpel script te schrijven dat niets anders doet dan een stukje tekst te retourneren als een PNG plaatje. Het doel is om kopjes in een site te kunnen genereren met een specifiek (en niet overal aanwezig) font.

Het script werkt prima, op één raar fenomeen na. Als ik ImageFTBBox (of ImageTTFBBOX, maakt geen verschil) gebruik om de grootte van het plaatje te bepalen, dan wordt het plaatje een paar pixels te smal en een paar pixels te laag.

Ik gebruik deze code om de grootte van het plaatje te bepalen:
PHP:
1
2
3
4
5
6
7
8
9
  // Calc the text size
  $box = imageftbbox($size, 0, "fonts/svenings.ttf", $text);

  // Calc the width and height of the image
  $width = max($box[2], $box[4]) - min($box[0], $box[6]);
  $height = max($box[1], $box[3]) - min($box[5], $box[7]);

  // Create the image
  $pic = imagecreatetruecolor($width, $height);


Twee voorbeeldjes:
fout (er wordt een stukje van de letter "t" afgehakt en een stukje van de onderkant)
Afbeeldingslocatie: http://www.solutionsource.nl/imagegen.php?text=blaat&color=32363f&size=64&addmargin=0

goed (ImageCreateTrueColor een 5 pixels groter plaatje laten maken)
Afbeeldingslocatie: http://www.solutionsource.nl/imagegen.php?text=blaat&color=32363f&size=64&addmargin=5

In het voorbeeld hierboven heb ik "met de natte vinger" 5 pixels toegevoegd aan de hoogte en de breedte. Hebben jullie een oplossing hoe ik de goede hoogte en breedte kan krijgen?

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Voordat je verkeerd gaat meten, je weet dat de size in het juiste format is?
The font size. Depending on your version of GD, this should be specified as the pixel size (GD1) or point size (GD2).
En daarnaast doet de manual dit om de x en y coördinaten voor imageftttext te bepalen:
PHP:
1
2
$x = $bbox[0] + (imagesx($im) / 2) - ($bbox[4] / 2) - 5;
$y = $bbox[1] + (imagesy($im) / 2) - ($bbox[5] / 2) - 5;
Daar zit wel een correctiefactor van 5 in :?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Je afbeelding begint ook 5px vanaf links pas, wellicht zijn dat net de pixels die je eigenlijk rechts hoort te hebben?

Over je originele probleem: waarom geen Cufon of SIFR gebruiken? Das ook een stuk beter voor zoekmachines en minder belastend voor je server.

Acties:
  • 0 Henk 'm!

  • Japius
  • Registratie: April 2003
  • Laatst online: 30-08 20:57
[b][message=32652430,noline]
Over je originele probleem: waarom geen Cufon of SIFR gebruiken? Das ook een stuk beter voor zoekmachines en minder belastend voor je server.
Als je daarentegen slechts eenmalig plaatjes hoeft te genereren, kies ik daarvoor, in plaats van telkens te moeten wachten totdat SIFR/Cufon de lay-out verstoort als de pagina compleet geladen is. SEO is ook wel op een andere manier op te lossen.

Acties:
  • 0 Henk 'm!

  • Bjornski
  • Registratie: September 2002
  • Laatst online: 29-07 14:59
Bedankt voor jullie reacties zover.

@Japius en Cartman
Ik ben niet bekend met CUFON (wel met SIFR). Ik zal over CUFON eens wat opzoeken. SIFR is geen optie omdat ik geen flash wil gebruiken.
Daarnaast is de bedoeling dat de plaatjes alleen gerenderd worden bij wijzigingen en daarna gewoon gecached worden (zowel in de browser als op de schijf van de webserver).
Zo voorkom ik overhead op de server en (vind ik) lelijke wachttijd bij het opbouwen van SIFR plaatjes.

@Cartman
Je hebt gelijk, dat was me niet opgevallen. De grap is dat het niet altijd precies 5 pixels is. Hoe kleiner de letter, hoe kleiner de marge links. Ik wil eigenlijk helemaal geen marge hebben.
Ik teken de tekst op het plaatje met deze regel code:
PHP:
1
2
  // Write the text using the Svensingsson font
  imagefttext($pic, $size, 0, 0, $height, $forecolor, "fonts/svenings.ttf", $text);


@Mithras
Of het nou pixels of points zijn maakt niet uit. Zowel ImageFTBBox als ImageFTText gaan uit van dezelfde eenheid. Het betreft trouwens GD2 (dus points).

Die -5 in jouw voorbeeld was me ook opgevallen, alleen waarom dat dan moet is mij volstrekt onduidelijk.

Iemand nog ideëen?

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 17-09 10:24
Heb dit probleem ook al een aantal keer om handen gehad; sommige ttf-fonts lijken op de een of andere manier afwijkingen te hebben, waardoor de berekening van breedte en soms ook hoogte van de tekst soms niet goed gaat. Ik heb ook wel eens het omgekeerde probleem gehad; bij sommige teksten werd de afbeelding breder dan nodig. Het makkelijkst is om een marge in te bouwen is mijn ervaring.

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Bjornski schreef op dinsdag 29 september 2009 @ 10:28:
@Japius en Cartman
Ik ben niet bekend met CUFON (wel met SIFR). Ik zal over CUFON eens wat opzoeken. SIFR is geen optie omdat ik geen flash wil gebruiken.
Daarnaast is de bedoeling dat de plaatjes alleen gerenderd worden bij wijzigingen en daarna gewoon gecached worden (zowel in de browser als op de schijf van de webserver).
Zo voorkom ik overhead op de server en (vind ik) lelijke wachttijd bij het opbouwen van SIFR plaatjes.
Bij Cufon heb je niet die lelijke wachttijd en het is SEO-wise netjes geregeld. M'n collega heeft ook weleens een oplossing gemaakt zoals jij nu maar kwam allemaal problemen tegen zoals dat een tekstje ook weleens een woord bold moet zijn of meerdere regels bevat. Of er zitten speciale karakters in die weer iets opfokken bijv.

Acties:
  • 0 Henk 'm!

  • Bjornski
  • Registratie: September 2002
  • Laatst online: 29-07 14:59
Cufón lijkt inderdaad een mooie oplossing voor mijn probleem.
Bedankt voor de tips!
Pagina: 1