PHP imagettftext() 字体字母不透明
PHP imagettftext() Font Letters Not Transparent
我正在使用 PHP GD 库来允许用户在我提供的背景图像之上生成他们的名字。当前的问题是输出的 PNG 中的字母不是透明的——如下图所示,它们相互重叠。
文字:罗杰Ajax
背景图片:
结果:
这可能是因为 TTF 字体?我尝试了以下字体,结果相同:
- HomemadeApple.ttf
- IndieFlower.ttf
- DancingScript.ttf
- KaushanScript Regular.ttf
- PermanentMarker.ttf
这是我的函数的完整源代码:
$signature_text = "Roger Ajax";
$font_name = "Homemade Apple";
// Lowercase all letters then capitalize First Lettter of each word
$signature_text = strtolower($signature_text);
$signature_text = ucwords($signature_text);
// Font & Text Settings
$font_size = 32;
$font = "/var/gosigner/fonts/HomemadeApple.ttf";
$desired_width = strlen($signature_text) * 34;
$start_position = 32;
// Background Image
$originalImage = $this->config->item('app_root') . "img/signature_field_blank.png";
// Verify BG Image can be found
if(!file_exists($originalImage)) {
$this->shared->throw_error("Signature template file could not be found");
}
$im = imagecreatefrompng($originalImage); // Get original
imagealphablending($im, false); // Save Transparency
imagesavealpha($im, true); // Save Transparencyc
$img_resized = imagecreatetruecolor($desired_width, 72); // Create new PNG
imagealphablending($img_resized, false); // Save Transparency
imagesavealpha($img_resized, true);
$trans_colour = imagecolorallocatealpha($img_resized, 0, 0, 0, 127);
imagefill($img_resized, 0, 0, $trans_colour);
$x = imagesx($im); // Original X
$y = imagesy($im); // Original Y
imagecopyresampled($img_resized, $im, 0, 0, 0, 0, 214, 72, $x, $y);
$black = imagecolorallocate($im, 0, 0, 0);
imagettftext($img_resized, $font_size, 0, $start_position, 45, $black, $font, $signature_text);
header('Content-Type: image/png');
imagepng($img_resized);
imagedestroy($im);
imagedestroy($img_resized);
我会将文本添加到 $img_resized(这里我使用不同的字体和颜色)
$img_resized = imagecreatetruecolor($desired_width, 72);
imagesavealpha($img_resized, true);
imagefill($img_resized, 0, 0, IMG_COLOR_TRANSPARENT);
$black = imagecolorallocate($img_resized, 0, 0, 0);
imagefttext($img_resized, $font_size, 0, $start_position, 45, $black, $font, $signature_text);
在将它放在 $im 之上之前。
imagecopyresampled($img_resized, $im, 0, 0, 0, 0, 214, 72, $x, $y);
(此外,我没有使用 imagealphablending() 部分并使用 IMG_COLOR_TRANSPARENT 而不是 $trans_colour)
我正在使用 PHP GD 库来允许用户在我提供的背景图像之上生成他们的名字。当前的问题是输出的 PNG 中的字母不是透明的——如下图所示,它们相互重叠。
文字:罗杰Ajax
背景图片:
结果:
这可能是因为 TTF 字体?我尝试了以下字体,结果相同:
- HomemadeApple.ttf
- IndieFlower.ttf
- DancingScript.ttf
- KaushanScript Regular.ttf
- PermanentMarker.ttf
这是我的函数的完整源代码:
$signature_text = "Roger Ajax";
$font_name = "Homemade Apple";
// Lowercase all letters then capitalize First Lettter of each word
$signature_text = strtolower($signature_text);
$signature_text = ucwords($signature_text);
// Font & Text Settings
$font_size = 32;
$font = "/var/gosigner/fonts/HomemadeApple.ttf";
$desired_width = strlen($signature_text) * 34;
$start_position = 32;
// Background Image
$originalImage = $this->config->item('app_root') . "img/signature_field_blank.png";
// Verify BG Image can be found
if(!file_exists($originalImage)) {
$this->shared->throw_error("Signature template file could not be found");
}
$im = imagecreatefrompng($originalImage); // Get original
imagealphablending($im, false); // Save Transparency
imagesavealpha($im, true); // Save Transparencyc
$img_resized = imagecreatetruecolor($desired_width, 72); // Create new PNG
imagealphablending($img_resized, false); // Save Transparency
imagesavealpha($img_resized, true);
$trans_colour = imagecolorallocatealpha($img_resized, 0, 0, 0, 127);
imagefill($img_resized, 0, 0, $trans_colour);
$x = imagesx($im); // Original X
$y = imagesy($im); // Original Y
imagecopyresampled($img_resized, $im, 0, 0, 0, 0, 214, 72, $x, $y);
$black = imagecolorallocate($im, 0, 0, 0);
imagettftext($img_resized, $font_size, 0, $start_position, 45, $black, $font, $signature_text);
header('Content-Type: image/png');
imagepng($img_resized);
imagedestroy($im);
imagedestroy($img_resized);
我会将文本添加到 $img_resized(这里我使用不同的字体和颜色)
$img_resized = imagecreatetruecolor($desired_width, 72);
imagesavealpha($img_resized, true);
imagefill($img_resized, 0, 0, IMG_COLOR_TRANSPARENT);
$black = imagecolorallocate($img_resized, 0, 0, 0);
imagefttext($img_resized, $font_size, 0, $start_position, 45, $black, $font, $signature_text);
在将它放在 $im 之上之前。
imagecopyresampled($img_resized, $im, 0, 0, 0, 0, 214, 72, $x, $y);
(此外,我没有使用 imagealphablending() 部分并使用 IMG_COLOR_TRANSPARENT 而不是 $trans_colour)