Ik wil een script schrijven dat met een gegeven tekst en hoek een afbeelding maakt dat de juiste grootte heeft en de tekst goed positioneert.
Jullie weten dat de functie imagettfbbox() geen rekening houdt met de hoek van de tekst. Dat is allemaal niet zo'n probleem omdat dat met een beetje wiskunde wel uit te rekenen is.
Het probleem onstaat wanneer de gedraaide tekst gerendert gaat worden door imagettftext(). Deze functie tekent namelijk een 90 graden tekst niet hetzelfde als een tekst onder nul graden. Het bewijs:

Links is de 90 graden tekst teruggedraait en rechts de tekst bij nul graden. Nou maakt me dat op zich niet zoveel uit, ware het niet dat ik zo geen berekening kan maken omdat ik niet weet waar die afwijking op gebaseerd is. Ik kan de afwijking met imagettfbbox() namelijk niet achterhalen. Ter volledigheid het script wat ik nu heb:
Ik draai dit script op php 4.3.9 met GD lib 2.0.28 onder windows xp. De berekeningen lijken misschien wat ingewikkeld, maar het is in feite gewoon wiskunde 1 zoals je dat ooit op de middelbare school hebt gehad.
Zijn er mensen die dit probleem kennen en er wellicht omheen gewerkt hebben?
Jullie weten dat de functie imagettfbbox() geen rekening houdt met de hoek van de tekst. Dat is allemaal niet zo'n probleem omdat dat met een beetje wiskunde wel uit te rekenen is.
Het probleem onstaat wanneer de gedraaide tekst gerendert gaat worden door imagettftext(). Deze functie tekent namelijk een 90 graden tekst niet hetzelfde als een tekst onder nul graden. Het bewijs:

Links is de 90 graden tekst teruggedraait en rechts de tekst bij nul graden. Nou maakt me dat op zich niet zoveel uit, ware het niet dat ik zo geen berekening kan maken omdat ik niet weet waar die afwijking op gebaseerd is. Ik kan de afwijking met imagettfbbox() namelijk niet achterhalen. Ter volledigheid het script wat ik nu heb:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| function imagettfbbox_t($size, $angle, $fontfile, $text) { // compute size with a zero angle $coords = imagettfbbox($size, 0, $fontfile, $text); // convert angle to radians $a = $angle * M_PI / 180; // compute some usefull values $ca = cos($a); $sa = sin($a); $ret = array(); $textwidth = abs($coords[0]) + abs($coords[2]); $textheight = abs($coords[1]) + abs($coords[7]); $ret['coords'] = $coords; $ret['textwidth'] = $textwidth; $ret['textheight'] = $textheight; $width_1 = $sa * $textheight; $width_2 = $ca * $textwidth; $height_1 = $ca * $textheight; $height_2 = $sa * $textwidth; $ret['width_1'] = round($width_1); $ret['width_2'] = round($width_2); $ret['height_1'] = round($height_1); $ret['height_2'] = round($height_2); $ret['width'] = round($width_1 + $width_2); $ret['height'] = round($height_1 + $height_2); return $ret; } // settings $text = 'Testing!'; $fontfile = 'verdana.ttf'; $fontsize = 20; $textangle = 0; $perc_baseline = 0.8; $margin = 4; header("Content-type: image/png"); $box = imagettfbbox_t($fontsize, $textangle, $fontfile, $text); $im = imagecreatetruecolor($box['width'] + (2 * $margin), $box['height'] + (2 * $margin)); $baseline_margin = ($box['textheight'] * ($perc_baseline - ($angle / 90) * $perc_baseline)); $white = imagecolorallocate($im, 255, 255, 255); $grey = imagecolorallocate($im, 128, 128, 128); $black = imagecolorallocate($im, 0, 0, 0); imagefill($im, 0, 0, $grey); $x_pos = $margin + $box['width_1']; $y_pos = $margin + $baseline_margin + $box['height_2']; imagettftext($im, $fontsize, $textangle, $x_pos, $y_pos, $black, $fontfile, $text); imagepng($im); imagedestroy($im); |
Ik draai dit script op php 4.3.9 met GD lib 2.0.28 onder windows xp. De berekeningen lijken misschien wat ingewikkeld, maar het is in feite gewoon wiskunde 1 zoals je dat ooit op de middelbare school hebt gehad.
Zijn er mensen die dit probleem kennen en er wellicht omheen gewerkt hebben?