Traitement du filigrane d'image PHP

La génération d'un filigrane est l'étape la plus simple de toute la technologie. Localiser l'emplacement du filigrane nécessite quelques connaissances géométriques, initialement superficielles.

Dans le dernier chapitre, nous avons appris la technologie de recadrage d'image. Le filigrane n’est qu’une petite déformation de la technologie de recadrage d’image.

Un peu de connaissances géométriques clés :

1. Taille de l'image

2. À quelles coordonnées l'image est placée

3. La largeur et hauteur de l'image

Le cœur de la technologie de filigrane d'image équivaut à deux images : une grande image ; Placez la petite image quelque part dans la plus grande image.

La technologie Watermark est la technologie la plus simple en la matière. La méthode de mise en œuvre est la suivante :

1. Ouvrez l'image originale (également appelée image cible de l'opération)

2. Ouvrez l'image du filigrane (également appelée image source du filigrane)

3. Utilisez imagecopymerge pour fusionner la petite image dans la position spécifiée de la grande image

4. Sortez l'image

.5 Détruire les ressources

1. Filigrane d'image simple

Image cible qui doit être filigranée (en supposant qu'elle soit stockée dans d:/ www/img/meinv.jpg sur mon ordinateur), l'image est la suivante :

99.png

L'image du logo qui doit être ajoutée (en supposant qu'elle soit stockée dans d:/ www/img/logo.png sur mon ordinateur), l'image est la suivante :

document_2015-09-22_56010df4559d3.png

Le plus important est d'utiliser cette fonction :

bool imagecopymerge ( ressource $ image cible, ressource $ image source, int $ cible commençant x, int $target début y, int $source x, int $source y, int $source largeur, int $source hauteur, int $transparence )

Remarque :
Transparence La valeur est un entier compris entre 0 et 100. La différence entre imagecopy et imagecopymerge est que l’un a de la transparence et l’autre non.

Suivez les étapes résumées et appliquez une méthode simple :

<?php
//打开目标图片
$dst = imagecreatefrompng('/upload/course/000/000/002/5833ebba648cf229.png');

//打开Logo来源图片
$src = imagecreatefrompng('/upload/course/000/000/002/5833ebe90cc11285.png');

//得到目标图片的宽高
$dst_info = getimagesize('5833ebba648cf229.png');

//得到logo图片的宽高
$src_info = getimagesize('5833ebe90cc11285.png');

//放到最右下脚可得出图片水印图片需要开始的位置即:
//x点位置:需要大图的宽 - 小图的宽;
//y点位置:放大图的高 - 小图的高

$dst_x = $dst_info[0] - $src_info[0];

$dst_y = $dst_info[1] - $src_info[1];

//要将图片加在右下脚
imagecopymerge($dst, $src, $dst_x, $dst_y, 0, 0, $src_info[0], $src_info[1], 100);

header('Content-type:image/png');
imagepng($dst);

imagedestroy($dst);

imagedestroy($src);

?>

Voyons l'effet final comme suit :

11.png

2. Faites une fonction de filigrane d'image intelligente

1. Nous pouvons créer une fonction qui ouvre automatiquement les images

Nous avons tous déjà appris les fonctions de création d'images ou d'ouverture d'images :

1.

2.imagecreatetruecolor

3.imagecreatefromjpeg etc.

Raisonnons. Si nous pouvons trouver un moyen d'obtenir le type MIME de l'image, nous pouvons simplement trouver la fonction pour ouvrir le fichier en fonction du type MIME.

Par conséquent, cette étape est divisée en deux parties :

1. Récupérez le type MIME du fichier et le type de retour.

2. Passez le chemin, ouvrez la fonction et renvoyez la ressource.

Par conséquent, nous pouvons transformer les deux blocs ci-dessus en deux fonctions.

Saisissez le chemin de l'image, renvoyez la largeur, la hauteur et le type MIME de l'image dans un tableau et utilisez les paramètres correspondants si nécessaire.

Nous pouvons passer le type MIME au tableau associatif de types dans $data. Le code est le suivant :

function getImageInfo($path) {
    $info = getimagesize($path);
    $data['width'] = $info[0];
    $data['height'] = $info[1];
    $data['type'] = $info['mime'];
    return $data;
}

La fonction pour ouvrir un fichier, passer le type d'une image, passer le chemin d'une image, l'image sera ouverte, et le type de ressource sera renvoyé.

Dans l'exemple suivant, $type est jugé à l'aide de switch...case. S'il s'agit d'une imagejpeg, imagecreatefromjpeg est utilisé pour ouvrir le fichier spécifié par le chemin dans $path. Enfin, un type de ressource est renvoyé.

function openImg($path, $type) {
    switch ($type) {
        case 'image/jpeg':
        case 'image/jpg':
        case 'image/pjpeg':
            $img = imagecreatefromjpeg($path);
            break;
        case 'image/png':
        case 'image/x-png':
            $img = imagecreatefrompng($path);
            break;
        case 'image/gif':
            $img = imagecreatefromgif($path);
            break;
        case 'image/wbmp':
            $img = imagecreatefromwbmp($path);
            break;
        default:
            exit('图片类型不支持');
    }
    return $img;
}

Calculer automatiquement la position :

Nous pouvons diviser la position en 10 valeurs, allant de 0 à 9.

Nous utilisons des dessins pour représenter les positions :

document_2015-09-22_5600ef919671d.png


Remarque :
0 est une position aléatoire et peut apparaître n'importe où sur la page. Mais cela ne peut pas dépasser le cadre du tableau. La position de

0 est :

x = 0 至 (大图宽 - 小图宽)
y = 0 至  (大图高 - 小图高)

La position de 1 est :

x = 0 
y = 0

La position de 2 est :

x = (大图宽 - 小图宽) /2 
y = 0

La position de 3 est :

La position de
x = 大图宽 - 小图宽
y = 0

4 est :

x = 0
y = (大图高 - 小图高) / 2

... ...et ainsi de suite.

Raisonnons sur le code d'implémentation de 0-9 :

 switch($pos){
        case 1:
            $x=0;
            $y=0;
            break;
        case 2:
            $x=ceil(($info['width']-$logo['width'])/2);
            $y=0;
            break;
        case 3:
            $x=$info['width']-$logo['width'];
            $y=0;
            break;
        case 4:
            $x=0;
            $y=ceil(($info['height']-$logo['height'])/2);
            break;
        case 5:
            $x=ceil(($info['width']-$logo['width'])/2);
            $y=ceil(($info['height']-$logo['height'])/2);
            break;
        case 6:
            $x=$info['width']-$logo['width'];
            $y=ceil(($info['height']-$logo['height'])/2);
            break;
        case 7:
            $x=0;
            $y=$info['height']-$logo['height'];
            break;
        case 8:
            $x=ceil(($info['width']-$logo['width'])/2);
            $y=$info['height']-$logo['height'];
            break;
        case 9:
            $x=$info['width']-$logo['width'];
            $y=$info['height']-$logo['height'];
            break;
        case 0:
        default:
            $x=mt_rand(0,$info['width']-$logo['width']);
            $y=mt_rand(0,$y=$info['height']-$logo['height']);
            break;
    }

Appelons enfin le code de fusion, sortie et destruction d'images :

imagecopymerge($dst,$src,$x,$y,0,0,$logo['width'],$logo['height'],$tm);

Nous intégrerons le code final Après cela , je vais vous donner l'expérience pour voir l'effet :

<?php

water('/upload/course/000/000/002/5833ebba648cf229.png','/upload/course/000/000/002/5833ebe90cc11285.png',0,50);

function water($img,$water,$pos=9,$tm=100){

   $info=getImageInfo($img);

   $logo=getImageInfo($water);

   $dst=openImg($img,$info['type']);
   $src=openImg($water,$logo['type']);


   switch($pos){
       case 1:
           $x=0;
           $y=0;
           break;
       case 2:
           $x=ceil(($info['width']-$logo['width'])/2);
           $y=0;
           break;
       case 3:
           $x=$info['width']-$logo['width'];
           $y=0;
           break;
       case 4:
           $x=0;
           $y=ceil(($info['height']-$logo['height'])/2);
           break;
       case 5:
           $x=ceil(($info['width']-$logo['width'])/2);
           $y=ceil(($info['height']-$logo['height'])/2);
           break;
       case 6:
           $x=$info['width']-$logo['width'];
           $y=ceil(($info['height']-$logo['height'])/2);
           break;

       case 7:
           $x=0;
           $y=$info['height']-$logo['height'];
           break;
       case 8:
           $x=ceil(($info['width']-$logo['width'])/2);
           $y=$info['height']-$logo['height'];
           break;
       case 9:
           $x=$info['width']-$logo['width'];
           $y=$info['height']-$logo['height'];
           break;
       case 0:
       default:
           $x=mt_rand(0,$info['width']-$logo['width']);
           $y=mt_rand(0,$y=$info['height']-$logo['height']);
           break;

   }
   imagecopymerge($dst,$src,$x,$y,0,0,$logo['width'],$logo['height'],$tm);


   imagejpeg($dst);

   imagedestory($dst);
   imagedestory($src);

}



   function openImg($path,$type){
       switch($type){
           case 'image/jpeg':
           case 'image/jpg':
           case 'image/pjpeg':
               $img=imagecreatefromjpeg($path);
               break;
           case 'image/png':
           case 'image/x-png':
               $img=imagecreatefrompng($path);
               break;
           case 'image/gif':
               $img=imagecreatefromgif($path);
               break;
           case 'image/wbmp':
               $img=imagecreatefromwbmp($path);
               break;
           default:
               exit('图片类型不支持');


       }
       return $img;
   }




?>

Cet article est uniquement destiné au personnel technique pour communiquer, apprendre et échanger des technologies.

Images utilisées dans cet article :

Les photos de Mme Fan Bingbing ne sont pas destinées à un usage commercial. Tous les droits de propriété appartiennent à Mme Fan Bingbing et aux institutions associées.

Le logo utilisé dans cet article appartient à Baidu.

C'est une déclaration !


Formation continue
||
<?php water('zxy.jpg','logo.gif',0,50); function water($img,$water,$pos=9,$tm=100){ $info=getImageInfo($img); $logo=getImageInfo($water); $dst=openImg($img,$info['type']); $src=openImg($water,$logo['type']); switch($pos){ case 1: $x=0; $y=0; break; case 2: $x=ceil(($info['width']-$logo['width'])/2); $y=0; break; case 3: $x=$info['width']-$logo['width']; $y=0; break; case 4: $x=0; $y=ceil(($info['height']-$logo['height'])/2); break; case 5: $x=ceil(($info['width']-$logo['width'])/2); $y=ceil(($info['height']-$logo['height'])/2); break; case 6: $x=$info['width']-$logo['width']; $y=ceil(($info['height']-$logo['height'])/2); break; case 7: $x=0; $y=$info['height']-$logo['height']; break; case 8: $x=ceil(($info['width']-$logo['width'])/2); $y=$info['height']-$logo['height']; break; case 9: $x=$info['width']-$logo['width']; $y=$info['height']-$logo['height']; break; case 0: default: $x=mt_rand(0,$info['width']-$logo['width']); $y=mt_rand(0,$y=$info['height']-$logo['height']); break; } imagecopymerge($dst,$src,$x,$y,0,0,$logo['width'],$logo['height'],$tm); imagejpeg($dst); imagedestory($dst); imagedestory($src); } function openImg($path,$type){ switch($type){ case 'image/jpeg': case 'image/jpg': case 'image/pjpeg': $img=imagecreatefromjpeg($path); break; case 'image/png': case 'image/x-png': $img=imagecreatefrompng($path); break; case 'image/gif': $img=imagecreatefromgif($path); break; case 'image/wbmp': $img=imagecreatefromwbmp($path); break; default: exit('图片类型不支持'); } return $img; } ?>
soumettreRéinitialiser le code
  • Recommandations de cours
  • Téléchargement du didacticiel