2010-08-15 8 views
0

Je travaille actuellement sur un site web et j'utilise depuis peu GD avec PHP pour créer automatiquement des images transparentes composées de texte à utiliser avec la navigation, les en-têtes, etc. sur le site web. Il me fait gagner beaucoup de temps dans Photoshop et je peux changer le texte sur les boutons instantanément si nécessaire.PHP GD Trim Pixels transparents de créé PNG

Eh bien, j'ai atteint une impasse ici. J'ai trouvé la méthode de dimensionnement de la "zone de texte", créée comme image, à la taille du texte. Mais le problème auquel je suis confronté est le fait que j'utilise une police TTF qui est différente de ce que GD attend de la taille. Fondamentalement, la dernière lettre serait coupée de l'image sortie. Donc je me demandais s'il y avait un moyen de résoudre ce problème tout en gardant un bord serré au texte ou de faire la zone de texte d'origine une taille beaucoup plus grande, puis "couper" les pixels transparents de l'image.

Voici le code que je travaille avec maintenant ...

<? 
$text = strip_tags($_GET['btn']); 
if(file_exists('nav_'.$text.'.png')) { 
    header("Content-type: image/png"); 

    $image = imagecreatefrompng('nav_'.$text.'.png'); 
    imagesavealpha($image, true); 
    imagealphablending($image, false); 
    imagepng($image); 
    imagedestroy($image); 
} else { 
    header("Content-type: image/png"); 

    $fontSize = 10; 
    $angle = 0; 
    $font = "RonniaBold.ttf"; 

    $size = imagettfbbox($fontSize, $angle, $font, $text); 
    $image = imagecreatetruecolor(abs($size[2]) + abs($size[0]) + 5, abs($size[7]) + abs($size[1]) + 5); 
    imagesavealpha($image, true); 
    imagealphablending($image, false); 

    $transparentColor = imagecolorallocatealpha($image, 200, 200, 200, 127); 
    imagefill($image, 0, 0, $transparentColor); 

    $textColor = imagecolorallocate($image, 125, 184, 222); 
    imagettftext($image, $fontSize, 0, 1, abs($size[5])+1, $textColor, $font, str_replace('_',' ',strtoupper($text))); 
    imagepng($image, 'nav_'.$text.'.png', 0); 
    imagedestroy($image); 
} 
?> 

Espérons que les gars ont un aperçu de cela, je ne pouvais vraiment l'utiliser!

Répondre

2

Dans la mesure du possible, j'utilise le Imagick class, car je préfère la bibliothèque ImageMagick. L'exemple suivant est pris presque textuellement de l'exemple donné here. Il crée une image en fonction de la taille du texte fourni:

$text = 'Hello World!'; 

// Create a new ImageMagick objects. 
$im = new Imagick(); 
$draw = new ImagickDraw(); 
$colour = new ImagickPixel('#000000'); 
$background = new ImagickPixel('none'); 

// Set font properties. 
$draw->setFont('Fertigo_PRO.otf'); 
$draw->setFontSize(72); 
$draw->setFillColor($colour); 
$draw->setStrokeAntialias(true); 
$draw->setTextAntialias(true); 

// Get font metrics. 
$fm = $im->queryFontMetrics($draw, $text); 

// Create text. 
$draw->annotation(0, $fm['ascender'], $text); 

// Create a new empty canvas, using the text size. 
$im->newImage($fm['textWidth'], $fm['textHeight'], $background); 

// Create the image. 
$im->setImageFormat('png'); 
$im->drawImage($draw); 

// Save the image. 
$im->writeImage('test.png'); 

Si vous souhaitez plus d'informations sur la classe Imagick, je recommande l'excellent Imagick articles de Mikko's Blog.

+0

Je pense qu'Imagick était bien mieux pour faire différentes choses, mais le problème est que mon hôte ne l'a pas installé sur leurs serveurs et ne peut pas l'installer en raison d'un conflit avec un autre plugin. C'est pourquoi j'essaie de le faire avec GD. –

2

Vous avez un problème avec votre code qui vous empêche de déterminer la taille correcte de votre texte - en demandant à la taille de la zone de texte avec imagettfbox vous utilisez $ texte:

$size = imagettfbbox($fontSize, $angle, $font, $text); 

Mais quand vous écrivez le texte à l'image que vous utilisez strtoupper ($ text) - qui agrandit votre texte (sauf si vous utilisez une police à espacement fixe).

Questions connexes