图像上的PHP GD库图像

时间:2017-12-30 21:34:13

标签: php image gd

我正在制作一些代码,允许用户为公司生成模拟礼品卡。他们输入面额,名称和上传徽标,它将使用基本模板图像并将该信息放在其上。

直到徽标部分,我根据需要处理了所有工作。

我使用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图片。想象一下,最好先将文本敲出来,然后将其用作徽标的新模板图像。

1 个答案:

答案 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并回显一个布尔值。无论如何,都会生成很多警告信息。

总结:

  1. 您不需要$base。而是使用$image
  2. 您不需要创建或回复$final,只需致电imagepng($new);
  3. 不要echo $base;阻止else阻止imagepng($image);阻止ICollections
  4. 所有这些都应该从PHP错误日志文件中明显看出。