Maison  >  Article  >  développement back-end  >  Comment implémenter la fonction de génération aléatoire d'images en filigrane en PHP

Comment implémenter la fonction de génération aléatoire d'images en filigrane en PHP

墨辰丷
墨辰丷original
2018-05-24 16:31:512271parcourir

Cet article présente principalement les informations pertinentes de PHP pour générer des images de filigrane aléatoires en détail. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

Bibliothèque graphique GD basée sur PHP. Uniquement pour ceux qui sont nouveaux dans la bibliothèque GD et qui peuvent apprendre des exemples.

1. Exigences

La mise en page du site Web utilise un style similaire à la liste des cours du MOOC. Chaque cours est une image de bannière, et sous l'image se trouve le titre. et introduction. Comme il existe un grand nombre de cours, il n'y a pas de bannières spéciales conçues pour tous les cours, vous devez donc générer vous-même des images selon certaines règles (j'avais initialement prévu d'utiliser p layout pour résoudre le problème, mais p+img n'est pas très facile à contrôler dans une mise en page réactive).

Rendu généré :

2. Outils et matériaux

1. extension de bibliothèque
2. Préparez plusieurs petites images en filigrane
3. Obtenez la valeur RVB de la couleur d'arrière-plan de l'image pré-générée

3. Codez

Le processus de génération d'images est détaillé dans le code.

class GenerateRandomImage
{
  /** @var integer 图片宽度 */
  public $imgWidth = 272;
  /** @var integer 图片高度 */
  public $imgHeight = 162;
  /** @var 根据type不同来生成不同的背景颜色,目前留个type分别为蓝色、紫色、黄色、绿色、灰色、土黄色 */
  public $type = '';
  /** @var 图片上要显示的文字 */
  public $text = '';
  /** @var integer 图片上文字的字体大小 */
  public $fontSize = 16;

  public function __construct($type, $text)
  {
    $this->type = $type;
    $this->text = $text;
  }
  /**
   * 创建生成随机图片
   * @author bignerd
   * @since 2017-03-21T14:49:41+0800
   */
  public function createImg()
  {
    /** @var 创建一个指定图片大小的空调色板
    $image = imagecreate($this->imgWidth, $this->imgHeight);
    $rgb  = $this->getBackground($this->type);
    /** @var 为图片创建一个背景色 */
    $backgroundColor = imagecolorallocate($image, $rgb['r'], $rgb['g'], $rgb['b']);
    /** @var 创建文字白色字体 */
    $textColor = imagecolorallocate($image, 255, 255, 255);
    /** @var 字体文件路径 */
    $font = $_SERVER['DOCUMENT_ROOT'].'/public/font/simhei.ttf';

    $x = 18;//文字起始位置x坐标
    $y = 50;//文字起始位置y坐标
    /** 文字写入图片 */
    $angle = 0;//角度0
    imagettftext($image, $this->fontSize, $angle, $x, $y, $textColor, $font, $this->text);
    /** @var 水印图片路径 **/
    $waterImgPath = $this->randWaterImage();
    /** @var 获取图片信息,返回值$waterInfo[2] 为图片类型常量 */
    $waterInfo  = getimagesize($waterImgPath);
    /** @var 将图片类型常量转换为真正的类型,如png */
    $waterType  = image_type_to_extension($waterInfo[2], false);//获取文件类型

    $createImageFunc = 'imagecreatefrom'.$waterType;
    /** @var 创建一个水印图片的副本 $createImageFunc 为根据图片类型来动态生成预调用的创建图片函数*/
    $mask = $createImageFunc($waterImgPath);
    $posX = $this->imgWidth - $waterInfo[0];//水印图片,在目标图片中的位置的x坐标
    $posY = $this->imgHeight - $waterInfo[1];//水印图片,在目标图片中的位置的y坐标
    /** http请求响应类型设置为 image/png 以便直接显示为图片 */
    header("Content-Type:image/png");
    /** 水印图片复制到创建的image */
    imagecopy($image, $mask, $posX, $posY, 0, 0, $waterInfo[0], $waterInfo[1]);
    imagepng($image);//输入图片到浏览器或者文件
    imagedestroy($image);//销毁图片
  } 
  /**
   * 图片背景颜色的rgb值
   * @author bignerd
   * @since 2017-03-21T14:50:16+0800
   */
  public function getBackground()
  {
    $background = [
      '1'=>['r'=>0, 'g'=>160,'b'=>233],
      '2'=>['r'=>198,'g'=>0, 'b'=>110],
      '3'=>['r'=>237,'g'=>109,'b'=>0],
      '4'=>['r'=>33, 'g'=>148,'b'=>75],
      '5'=>['r'=>63, 'g'=>58, 'b'=>57],      
      '6'=>['r'=>202,'g'=>162,'b'=>101],
    ];
    return $background[$this->type];
  }
  /**
   * 随机水印图片路径
   * @author bignerd
   * @since 2017-03-21T14:51:00+0800
   * @return 路径
   */
  public function randWaterImage()
  {
    $folder = [
      '1'=>'product','2'=>'team','3'=>'architecture','4'=>'developer','5'=>'test','6'=>'engineer'
    ];
    $targetFolder = $_SERVER['DOCUMENT_ROOT'].'/public/images/role/'.$folder[$this->type].'/'.rand(1,38).'.png';
    return $targetFolder;
  }
}

$image = new GenerateRandomImage(1,"扛得住的MySql数据架构");
$image->createImg();

On peut donc l'utiliser directement dans la page c99396a83c867f34cfa28709a24aedcf pour afficher directement l'image.

Remarque : J'ai rencontré un problème pendant le processus : si l'image en filigrane est une image png transparente, lorsque vous copiez l'image en filigrane sur une image, elle sera apparaître comme L'arrière-plan blanc ne peut pas être mélangé de manière transparente avec l'arrière-plan de l'image que nous avons défini, le même traitement des couleurs doit donc être effectué pour les images de filigrane aléatoires.

4. Résumé

Ce petit exemple utilise des étapes simples pour générer une image et l'afficher directement dans le navigateur. Elle peut également être donnée à imagepng<.> Ajoutez le deuxième paramètre, qui est le chemin, pour enregistrer l'image. Par conséquent, en apprenant plusieurs méthodes dans la bibliothèque GD dans les exemples, vous pouvez créer des images, ajouter des filigranes de texte ou des filigranes d'image aux images.

Ce qui précède représente l’intégralité du contenu de cet article, j’espère qu’il sera utile à l’étude de chacun.


Recommandations associées :

Implémentation PHP du filigrane d'image encapsulation de classe

phpFiligrane d'image code

Implémentation PHP du Filigrane d'image partage de code d'encapsulation de classe

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn