imagettftext Buchstabe X einfärben

Hallo,

ich benötige euren Rat bzw. Hilfe. Ich komme auf keinen Lösungsansatz.

Ich erzeuge mit meinem PHP Script und einer bestimmten Schriftart eine Bild auf dem ein Wort steht z.B. "neXcal". Ich möchte nun das nur das X in einer bestimmten Farbe eingefärbt wird. Wie mache ich das?

Hier mein bereits verwendeter Code:
PHP:
<?php
include("../../../../../inc/config.php");
include("../../../../../inc/func.php");

header("Content-type: image/jpeg");

$font = "exellencef";

$sx = $_REQUEST['width'];
$sy = $_REQUEST['height'];

$xcolors = split(",", get_rgb($_REQUEST['xcolor']));
$tcolors = split(",", get_rgb("000000"));
$bgcolors = split(",", get_rgb("FFFFFF"));

$im = imagecreatetruecolor($sx, $sy);
$fc = imagecolorallocate($im, $tcolors[0], $tcolors[1], $tcolors[2]);
$bgc = imagecolorallocate($im, $bgcolors[0], $bgcolors[1], $bgcolors[2]);
imagefill($im, 0, 0, $bgc);

$rotation = 0;

if ($_REQUEST['size'] == "auto") {

	$fontsize = 1;
	
	do {
		$fontsize *= 1.1;
		$box = @imagettfbbox($fontsize, 0, $font, $_REQUEST['text']);
		$textwidth = abs($box[4] - $box[0]);
		$textheight = abs($box[5] - $box[1]);
	}
	while ($textwidth < $sx * 0.45);
				
	$x = 0;
	$y = $sy/2 + sin(deg2rad($rotation))*$textwidth/2 + cos(deg2rad($rotation))*$textheight/2;

} else {
	$fontsize = $_REQUEST['size'];
	$x = 0;
	$y = $sy-5;
}
		
imagettftext($im, $fontsize, $rotation, $x, $y, $fc, $font, $_REQUEST['text']);

if ($_REQUEST['do'] == "preview") {
	imagejpeg($im, "", 80);
	imagedestroy($im);
} elseif ($_REQUEST['do'] == "save") {
	if (is_dir("../../../../../content/images/".$_REQUEST['area']."/text2image/")) {	
		imagejpeg($im, "../../../../../content/images/".$_REQUEST['area']."/text2image/".$_REQUEST['datei'].".jpg", 80);
		imagedestroy($im);
	} else {
		mkdir("../../../../../content/images/".$_REQUEST['area']."/text2image/", 0700);
		imagejpeg($im, "../../../../../content/images/".$_REQUEST['area']."/text2image/".$_REQUEST['datei'].".jpg", 80);
		imagedestroy($im);
	}
}

?>

Gruß
 
Dazu musst du den Text zerteilen und jeweils „ne“, „X“ und „cal“ einzeln ausgeben. Bei einer Schriftart mit fester Laufweite kannst du auch nur das „X“ einzeln ausgeben und dafür in „neXcal“ ein Leerzeichen für das „X“ einsetzen.
 
Hi,

@Gumbo

Die Laufweite, genau das ist das Problem. Beim X ist sie gerade größer.

Gibt es vielleicht noch eine andere Möglichkeit als mit Leerzeichen die Laufweite vorzutäuschen?

Gruß
 
Hi,

@FabianF

Du hast recht mit ImageTTFBBox funktioniert das zentrieren, sowie das erkennen der Breite eines Buchstaben (Dickte) nur die Vor- und Nach- Breite stimmen noch nicht ganz.

Hier der Code:

PHP:
<?php
include("../../../../../inc/config.php");
include("../../../../../inc/func.php");

header("Content-type: image/jpeg");

$font = "exellencef";

$sx = $_REQUEST['width'];
$sy = $_REQUEST['height'];

$xcolors = split(",", get_rgb($_REQUEST['xcolor']));
$tcolors = split(",", get_rgb("000000"));
$bgcolors = split(",", get_rgb("FFFFFF"));

$im = imagecreatetruecolor($sx, $sy);
$xc = imagecolorallocate($im, $xcolors[0], $xcolors[1], $xcolors[2]);
$fc = imagecolorallocate($im, $tcolors[0], $tcolors[1], $tcolors[2]);
$bgc = imagecolorallocate($im, $bgcolors[0], $bgcolors[1], $bgcolors[2]);
imagefill($im, 0, 0, $bgc);

$rotation = 0;

if ($_REQUEST['size'] == "auto") {

	$firsttext = $_REQUEST['text'];
	$lasttext = "";
	$theX = "";

	$fontsize = 1;
	do {
		$fontsize *= 1.1;
		$box = @imagettfbbox($fontsize, 0, $font, $firsttext);
		$textwidth = abs($box[4] - $box[0]);
		$textheight = abs($box[5] - $box[1]);
	}
	while ($textwidth < $sx * 0.45);
	
	$box2 = @imagettfbbox($fontsize, 0, $font, "a");
	$textwidth2 = abs($box2[4] - $box2[0]);
	$textheight2 = abs($box2[5] - $box2[1]);
	
	$box3 = @imagettfbbox($fontsize, 0, $font, "aa");
	$textwidth3 = abs($box3[4] - $box3[0]);
	$textheight3 = abs($box3[5] - $box3[1]);
	
	$pos = strpos ($_REQUEST['text'], "X");

	if ($pos == true) {
		$txtlen = strlen($_REQUEST['text']);
		$firsttext = substr($_REQUEST['text'], 0, $pos);
		$lasttext = substr($_REQUEST['text'], "-".($txtlen - ($pos + 1)));
		$theX = "X";
	}
				
	$x = 0;
	$y = $sy/2 + sin(deg2rad($rotation))*$textwidth/2 + cos(deg2rad($rotation))*$textheight/2;
	
	imagettftext($im, $fontsize, $rotation, $x, $y, $fc, $font, $firsttext);
	imagettftext($im, $fontsize, $rotation, (($pos + 1) * ($textwidth3 - $textwidth2)), $y, $fc, $font, $lasttext);
	imagettftext($im, $fontsize, $rotation, ($pos * ($textwidth3 - $textwidth2)), $y, $xc, $font, $theX);

} else {
	$fontsize = $_REQUEST['size'];
	
	$box = @imagettfbbox($fontsize, 0, $font, "a");
	$textwidth = abs($box[4] - $box[0]);
	$textheight = abs($box[5] - $box[1]);
	
	$box2 = @imagettfbbox($fontsize, 0, $font, "ee");
	$textwidth2 = abs($box2[4] - $box2[0]);
	$textheight2 = abs($box2[5] - $box2[1]);

	$firsttext = $_REQUEST['text'];
	$lasttext = "";
	$theX = "";
	
	$pos = strpos ($_REQUEST['text'], "X");

	if ($pos == true) {
		$txtlen = strlen($_REQUEST['text']);
		$firsttext = substr($_REQUEST['text'], 0, $pos);
		$lasttext = substr($_REQUEST['text'], "-".($txtlen - ($pos + 1)));
		$theX = "X";
	}
		
	$x = 0;
	$y = $sy-5;
	
	imagettftext($im, $fontsize, $rotation, $x, $y, $fc, $font, $firsttext);
	imagettftext($im, $fontsize, $rotation, (($pos + 1) * ($textwidth2 - $textwidth)), $y, $fc, $font, $lasttext);
	imagettftext($im, $fontsize, $rotation, ($pos * ($textwidth2 - $textwidth)), $y, $xc, $font, $theX);
}
		

if ($_REQUEST['do'] == "preview") {
	imagejpeg($im, "", 80);
	imagedestroy($im);
} elseif ($_REQUEST['do'] == "save") {
	if (is_dir("../../../../../content/images/".$_REQUEST['area']."/text2image/")) {	
		imagejpeg($im, "../../../../../content/images/".$_REQUEST['area']."/text2image/".$_REQUEST['datei'].".jpg", 80);
		imagedestroy($im);
	} else {
		mkdir("../../../../../content/images/".$_REQUEST['area']."/text2image/", 0700);
		imagejpeg($im, "../../../../../content/images/".$_REQUEST['area']."/text2image/".$_REQUEST['datei'].".jpg", 80);
		imagedestroy($im);
	}
}

?>
 
Zurück