我正在制作一些代码,允许用户为公司生成模拟礼品卡。他们输入面额,名称和上传徽标,它将使用基本模板图像并将该信息放在其上。
直到徽标部分,我根据需要处理了所有工作。
我使用imagecreatefrompng("template.png")
创建了模板图片,并使用imagettftext()
将文字放置在所需的坐标中。
现在,当涉及到徽标时,我遇到了一些问题。
我首先尝试创建基本图像(模板+文本)然后使用imagecopy
以便将徽标添加到新图像中,但我每次看起来都是基本图像而我从未看到过徽标。
我尝试过硬编码图像的路径,但我仍然没有得到理想的结果。
// If we have all of the post data
if($denomination && $name && $pin && $defaultText){
// Create our header to flush the image to browser
header("Content-type: image/png");
header("Cache-Control: no-store, no-cache");
header('Content-Disposition: attachment; filename="GiftCard.png"');
// Define our source image
$image = imagecreatefrompng("card.png");
// Preserve transparency
imagealphablending($image, true);
imagesavealpha($image, true);
// Colors
$backgroundColor = imagecolorallocate ($image, 255, 255, 255);
$textColor = imagecolorallocate ($image, 255, 255,255);
$font = 'arial.ttf';
// Data
$data = [
'name' => [
'x' => 30,
'y' => 260,
'size' => 12,
'angle' => 0,
'content' => $name,
],
'pin' => [
'x' => 175,
'y' => 210,
'size' => 18,
'angle' => 0,
'content' => $pin
],
'denomination' => [
'x' => 435,
'y' => 45,
'size' => 20,
'angle' => 0,
'content' => $denomination
],
'defaultText' => [
'x' => 30,
'y' => 290,
'size' => 12,
'angle' => 0,
'content' => $defaultText
]
];
// Name
imagettftext($image, $data['name']['size'], $data['name']['angle'], $data['name']['x'], $data['name']['y'], $textColor, $font, $data['name']['content']);
// Pin
imagettftext($image, $data['pin']['size'], $data['pin']['angle'], $data['pin']['x'], $data['pin']['y'], $textColor, $font, $data['pin']['content']);
// Denomination
imagettftext($image, $data['denomination']['size'], $data['denomination']['angle'], $data['denomination']['x'], $data['denomination']['y'], $textColor, $font, '$' . $data['denomination']['content']);
// Default Text
imagettftext($image, $data['defaultText']['size'], $data['defaultText']['angle'], $data['defaultText']['x'], $data['defaultText']['y'], $textColor, $font, $data['defaultText']['content']);
// Create our base image with text
$base = imagepng($image);
// Do we need to place the logo?
if($_FILES["logo"]["name"]){
// Create our logo
$logo = imagecreatefrompng($target_dir.$_FILES["logo"]["name"]);
// Get current width/height of template
list($top_width, $top_height) = getimagesize($base);
// Get width/height of logo
list($bottom_width, $bottom_height) = getimagesize($logo);
// compute new width/height
$new_width = ($top_width > $bottom_width) ? $top_width : $bottom_width;
$new_height = $top_height + $bottom_height;
// create new image and merge
$new = imagecreate($new_width, $new_height);
imagecopy($new, $base, 0, 0, 0, 0, $top_width, $top_height);
imagecopy($new, $logo, 0, $top_height+1, 0, 0, $bottom_width, $bottom_height);
// Send image to browser
$final = imagepng($new);
echo $final;
// Free up memory
imagedestroy($final);
}else{
echo $base;
// Free up memory
imagedestroy($base);
}
}
我尝试的是什么东西都很突出?简而言之,我正在尝试将文本和图像添加到"模板" png
图片。想象一下,最好先将文本敲出来,然后将其用作徽标的新模板图像。
答案 0 :(得分:1)
// Create our base image with text
$base = imagepng($image);
imagepng
返回布尔值,输出图像。因此,此时您已将标题和工作PNG发送到浏览器。然后,您尝试在boolean
上执行图像操作。这将生成警告消息。
你在这里重复错误:
...
// Send image to browser
$final = imagepng($new);
echo $final;
// Free up memory
imagedestroy($final);
} else {
echo $base;
// Free up memory
imagedestroy($base);
}
现在您要么输出两个PNG并回显一个布尔值,要么输出一个PNG并回显一个布尔值。无论如何,都会生成很多警告信息。
总结:
$base
。而是使用$image
。$final
,只需致电imagepng($new);
。echo $base;
阻止else
阻止imagepng($image);
阻止ICollections
。所有这些都应该从PHP错误日志文件中明显看出。