Maison  >  Article  >  développement back-end  >  Comment utiliser ImageMagick pour générer des images base64 en php (code)

Comment utiliser ImageMagick pour générer des images base64 en php (code)

不言
不言original
2018-09-13 17:34:073960parcourir

Le contenu de cet article explique comment utiliser ImageMagick pour générer des images base64 (code) en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Dans les projets PHP récents, des effets de dessin et d'épissage d'images doivent être utilisés. Voici quelques points utilisés dans le processus de développement et quelques pièges qui ont été rencontrés. Générez un format d'image base64 via ImageMagick pour une utilisation par le front-end.

Quelques points de connaissances requis

PHP convertit les images en encodage base64 et convertit les images base64 en images et enregistre le code

Convertir les images en encodage base64

/*图片转换为 base64格式编码*/
$img = 'uploads/about.png';
$base64_img = base64EncodeImage($img);
echo '<img  alt="Comment utiliser ImageMagick pour générer des images base64 en php (code)" >';
 
function base64EncodeImage ($image_file) {
    $base64_image = '';
    $image_info = getimagesize($image_file);
    $image_data = fread(fopen($image_file, 'r'), filesize($image_file));
    $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
    return $base64_image;
}

Convertir une image base64 en image et enregistrer

/*  base64格式编码转换为图片并保存对应文件夹 */
function base64_image_content($base64_image_content,$path){
    //匹配出图片的格式
    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
        $type = $result[2];
        $new_file = $path."/".date('Ymd',time())."/";
        if(!file_exists($new_file)){
            //检查是否有该文件夹,如果没有就创建,并给予最高权限
            mkdir($new_file, 0700);
        }
        $new_file = $new_file.time().".{$type}";
        if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
            return '/'.$new_file;
        }else{
            return false;
        }
    }else{
        return false;
    }
}
 
echo base64_image_content($base64_img,"uploads/");

base64

Base64 est une méthode de représentation de données binaires arbitraires avec 64 caractères.
Le principe de Base64 est très simple. Tout d'abord, préparez un tableau contenant 64 caractères :

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
Ensuite, traitez les données binaires, chaque groupe de 3 octets, soit un total de 3x8= 24 bits, divisé en 4 groupes, chaque groupe a exactement 6 bits

Et si les données binaires à encoder n'étaient pas un multiple de 3, et qu'il restait 1 ou 2 octets au final ? Une fois que Base64 a complété la fin avec x00 octets, il ajoute ensuite des signes 1 ou 2 = à la fin du codage pour indiquer le nombre d'octets complétés, qui seront automatiquement supprimés lors du décodage.

La taille des images jpg est plus petite que celle du png
Utilisez la classe Imagick de PHP pour exploiter les images

Opérations spécifiques à Imagick

(1) Créez une carte de base, 750 px. large, 1046px de haut, fond blanc, image au format jpg

// 初始化一个画板
        $img =new Imagick();
        $img->newImage(750,1046,'white','jpg') ;

(2) Ajoutez l'image requise à la carte de base

à condition que nous connaissions déjà les images qui doivent l'être. Adresse du lien fusionné

$item_img='https://img.alicdn.com/bao/uploaded/i1/1750208593/TB1rgM3hhtnkeRjSZSgXXXAuXXa_!!0-item_pic.jpg'

第一步:实例化图片
$imgtwo = new Imagick($item_img);

第二步:设置添加图片的大小
$imgtwo->resizeImage(750,764,Imagick::FILTER_LANCZOS,1);

关于resizeImage参数说明
    bool Imagick::resizeImage ( int $columns , int $rows , int $filter , float $blur [, bool $bestfit = false ] )

参数:
  ● columns 图片的宽度
  ● rows 图片高度
  ● filter 过滤器,用于过滤图片,有高斯filte根据情况而定
  ● blur blur=1 为虚化, blur =-1 为锐化

第三步:与底图合并
$img->compositeImage($imgtwo,$imgtwo->getImageCompose(),0,0);

使用compositeImage();
    bool Imagick::compositeImage ( Imagick $composite_object , int $composite , int $x , int $y [, int $channel = Imagick::CHANNEL_ALL ] )

参数:
  ● composite_object :用于合并的图片的Imagick对象
  ● composite:合并操作,定义操作常量。 具体请查看 合并操作常量列表
  ● x:相对图像顶点左上位置(0,0)的横坐标
  ● y:相对图像顶点左上位置(0,0)的纵坐标
  ● channel:通过传入一个通道常量,来开启通道模式。为了支持多个通道,可以通过二进制运算的操作来合并多个通道常量。

到这里就可以得到一个合并的图片了
1、加一个header信息,可以直接在网页上查看图片
    header("Content-Type: img/png");
    echo $img;
2、可以把图片在指定目录中生成,在指定目录下生成为img.png
    $file="./img.png";
    $img->writeImage($file);


我这里是这样处理:
    header ( 'Content-type: ' . strtolower ($img->getImageFormat ()) );
    $type = strtolower($img->getImageFormat());
    $dest_img='/data/tmp/' . md5(microtime(true)).'.'.$type;    //要生成的图片的路径,随机生成图片名称

(3). Collez le texte sur l'image

et écrivez le texte. Prenez l'ajout de texte du magasin comme exemple pour terminer l'écriture du texte étape par étape.

    $shop_title='测试店铺';
    // 添加店铺文字
    $drawQr = new ImagickDraw(); // 实例化ImagickDraw
    $drawQr -> setFillColor(new ImagickPixel('#999999')); // 颜色
    $drawQr -> setFontSize('24'); // 大小
    $drawQr -> setFont('../../conf/Microsoftyahei.ttf'); // 字体
    $drawQr -> setTextAlignment(Imagick::ALIGN_LEFT); // 字体方向
    // ps: Imagick::ALIGN_RIGHT 朝右边    Imagick::ALIGN_LEFT 左边   Imagick::ALIGN_CENTER 中间
    $drawQr -> setTextEncoding("utf-8"); // 字体编码
    $drawQr -> annotation(114,990,$shop_title); // 画出文字
    $img -> drawImage($drawQr);  // 画在地板上

Interprétation détaillée :

1. Instanciez la classe ImagickDraw :

$drawQr = new ImagickDraw();

2. Définissez la couleur de la police

$drawQr -> setFillColor(new ImagickPixel(&#39;#999999&#39;));

3. . Définir la taille de la police

$drawQr -> setFontSize(&#39;24&#39;);

4. Définir le format de la police

$drawQr -> setFont(&#39;../../conf/Microsoftyahei.ttf&#39;);

5. Définir la direction de la police

$draw->setTextAlignment(Imagick::ALIGN_RIGHT);

ps : Imagick::ALIGN_RIGHT Vers la droite. Imagick : :ALIGN_LEFT Gauche Imagick::ALIGN_CENTER Milieu

6. Définir l'encodage de la police

$drawQr -> setTextEncoding("utf-8");

7. Dessiner le texte

$drawQr -> annotation(114,990,$shop_title);

8. Police

$img -> drawImage($drawQr);

Quelques pièges lors de l'écriture de texte :

Lorsque le format de police n'est pas défini, les caractères chinois analyseront les erreurs
(l'anglais n'a pas de problème)

Comment utiliser ImageMagick pour générer des images base64 en php (code)

(Échec de l'analyse des caractères chinois)

Comment utiliser ImageMagick pour générer des images base64 en php (code)

(Définissez le format de police pour qu'il s'affiche normalement )

Comment utiliser ImageMagick pour générer des images base64 en php (code)

(4). Exportation de l'image en base64

L'image finale que notre groupe doit transmettre au front-end au format base64. , effectuez les opérations suivantes , convertissez l'image finale épissée en base64 et sortez-la.

    $dest_img='/data/tmp/' . md5(microtime(true)).'.'.$type; //要生成的图片的路径
    $Return = array();
    // *图片转换为 base64格式编码*
    $base64_image = '';
    $image_info = getimagesize($dest_img);
    $image_data = fread(fopen($dest_img, 'r'), filesize($dest_img));
    $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
    $Return['data']=$base64_image;
    return  $Return;

$base64_image est une image au format base64.

Il est à noter que les données base64 obtenues par le front end contiennent le caractère retour chariot 'rn', qui nécessite un traitement particulier pour afficher correctement l'image.

Comment utiliser ImageMagick pour générer des images base64 en php (code)

L'image fusionnée finale sera obtenue et la taille de l'image épissée peut être ajustée pour obtenir différentes images.

Recommandations associées :

Téléchargement d'images et utilisation d'ImageMagick pour générer des vignettes

PHP pour implémenter le téléchargement d'images et utiliser ImageMagick génère des vignettes,

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