[PHP/GD] Tekst schuin plaatsen op zelfde regel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Omdat ik boven een tabel schuine kolomnamen wil zetten, probeer ik het volgende plaatje met php te maken:

Afbeeldingslocatie: http://www.danandan.luna.nl/got/schuin2.png

Na een hoop gepruts (en het bekijken van voorbeelden), ben ik tot het volgende gekomen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
header("Content-type: image/png");

$img   = imagecreate(100, 75);
$bg    = imagecolorallocate($img, 255, 255, 0);
$black = imagecolorallocate($img, 0, 0, 0);

$roles = array('anoniem', 'ingelogd', 'leerling', 'docent', 'rector');
$left  = 0;
foreach ($roles as $role) {
  imagestring ($img, 2, 0, $left, $role, $black);
  $left+= 15;
}

$img2 = imagerotate($img, 45, $bg);
imagedestroy($img);

imagepng($img2);
Dit geeft echter niet helemaal het gewenste resultaat:

Afbeeldingslocatie: http://www.danandan.luna.nl/got/schuin.png

Ik weet niet wat ik nu moet veranderen. Als ik het systeem van plaatjes maken met php goed begrijp, moet ik eerst 5 losse plaatjes maken (voor elke rol 1) en die dan bij elkaar voegen. Klopt dat? En kan dat ik die loop worden meegenomen?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Sowieso gebruik je $left voor de vertikale positie, dus die naam klopt al niet..

Verder zet je éérst je tekst *netjes* aligned onder elkaar (haal de rotate maar eens weg) en vervolgens ga je rotaten.

Schrijf het eens op een stukje papier en draai dat papiertje eens 45°, jouw resultaat is niet meer dan logisch.

Wat je moet doen is dus ipv alleen naar onderen te gaan óók stapjes naar rechts, zodat je iets als dit krijgt zonder de rotate:

anoniem
   ingelogd
      leerling
         docent
            rector


Als je hem vervolgens op de goeie plek neerzet en hem 45° draait is ie goed.

Overigens kun je met imagettftext() tekst neerzetten én de hoek bepalen, dus dan hoef je niet meer te rotaten, want zoals je ziet levert dat rotaten ranzige tekst op.

[ Voor 23% gewijzigd door Osiris op 04-08-2006 18:10 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Je zult inderdaad de losse plaatjes moeten roteren. Je hoeft er niet perse vijf te maken. Je kunt immers het tijdelijke plaatje (Waarin je schrijft en draait) gewoon hergebruiken wanneer je deze in je doelplaatje geplakt hebt. Nadeel is dat je enkel vierkante stukken kunt plakken. Je zult dus een beetje met het transparantie moeten pielen zodat de tekst elkaar niet overschrijft.

Wat je ook kunt doen is even de posities doorrekenen zodat je de tekst telkens iets verder laat verspringen en daarna het plaatje in het geheel verdraaid (en eventueel uitknipt). Zoals je in je huidige plaatje kunt zien mot de volgende regel gewoon een stukje inspringen (de regelhoogte om precies te zijn)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nou ken ik gd niet goed, maar als je erachter kan komen wat de regelhoogte is, weet je ook hoe ver je moet inspringen om het resultaat te krijgen wat je verwacht.

Aan je (wat verwarrende, omdat je $left gebruikt waar je $top bedoelt) code te zien, moet je ook gewoon op x-coordinaat $left tekenen ipv op 0 wat je nu doet. Oftewel, verander regel 10 in
PHP:
10
imagestring ($img, 2, $left, $left, $role, $black);


.edit: spuit 11 :Y)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Als je in plaats van imagestring() imagettftext() gebruikt, kun je behalve een ander font met behulp van het 3de argument de rotatie aanpasse van de text zelf, in plaats van het gehele canvas zoals je nu doet.

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Dank voor de reakties. Uiteindelijk heb ik dit en het werkt perfect. (Ga het nog uitbreiden met hoogte berekenen adhv langste string etc, maar de basis is er):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
header("Content-type: image/png"); 

$img   = imagecreate(100, 50); 
$bg    = imagecolorallocate($img, 255, 255, 255); 
$black = imagecolorallocate($img, 0, 0, 0); 

$roles = array('anoniem', 'ingelogd', 'leerling', 'docent', 'rector'); 
$left  = 5; 
foreach ($roles as $role) { 
  imagettftext ($img, 8, 45, $left, 50, $black, 'arial.ttf', $role);
  $left+= 17; 
} 

imagepng($img);
:)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."

Pagina: 1