Detaillierte Erläuterung der Erstellung von PHP-Miniaturansichten und Bildwasserzeichen

墨辰丷
Freigeben: 2023-03-28 08:54:02
Original
1733 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich der Prozess der Erstellung von PHP-Miniaturansichten und Bildwasserzeichen im Detail vorgestellt. Die relevanten Schritte von PHP zur Implementierung des Hinzufügens von Wasserzeichen und der Erstellung von Miniaturansichten haben einen bestimmten Referenzwert.

1. Starten Sie den Vorgang zum Hochladen von Bildern auf der Website. Die Miniaturbildfunktion wird häufig verwendet. Hier habe ich eine Image-Klasse für die Bildverarbeitung geschrieben, die Miniaturansichten generieren und Wasserzeichen hinzufügen kann.

2. So generieren Sie Miniaturansichten

Der Schlüssel zum Generieren von Miniaturansichten liegt in der Berechnung des Zoomverhältnisses.
Basierend auf der Bildskalierung und einigen häufigen Änderungen in Breite und Höhe habe ich hier einen Algorithmus zur Berechnung des Skalierungsverhältnisses entwickelt: Verwenden Sie die Breite und Höhe des neuen Bilds (d. h. Miniaturansicht) und teilen Sie es Breite und Höhe, je nachdem, welcher Wert größer ist, werden als Skalierungsverhältnis verwendet:

Zoomverhältnis = Max ({ neue Bildhöhe / ursprüngliche Bildhöhe, neue Bildbreite / ursprüngliche Bildbreite} )

Das heißt:

If ( (Neue Bildhöhe / Originalbildhöhe) > (Neue Bildbreite / Originalbildbreite) ) {

Zoomverhältnis = Neue Bildhöhe / Originalbildhöhe;

}

Hier sind die Bildskalierungsszenarien der Szene und ihre Verarbeitungsmethoden:

z. B.

Szenario 1, das Originalbild ist größer als das neue Bild, Skalierungsverhältnis = neue Bildbreite/ursprüngliche Bildbreite:

Szenario 2, das Originalbild ist größer als das neue Bild, b. Skalierungsverhältnis = neue Bildhöhe/Originalbildhöhe:

Szenario 3. Das Originalbild ist größer als das neue Bild und die Breite und Höhe des neuen Bildes sind gleich, d. h. die Form des neuen Bildes ist quadratisch, sodass der obige Skalierungsalgorithmus ebenfalls anwendbar ist.

Szene 4: Wenn „Neue Bildbreite >= Originalbildbreite“ und „Neue Bildhöhe >= Originalbildhöhe“, wird das Bild nicht skaliert oder vergrößert und das Originalbild bleibt erhalten.

Szenario 5: Wenn „Neue Bildbreite < Originalbildbreite“ und „Neue Bildhöhe>= Originalbildhöhe“, dann legen Sie zuerst „Neue Bildhöhe“ fest = Höhe des Originalbildes“ anpassen und dann ausschneiden.

Szenario 6, wenn „Neue Bildhöhe < Originalbildhöhe“ und „Neue Bildbreite>= Originalbildbreite“, dann legen Sie zuerst „Neue Bildbreite“ fest = „Originalbildbreite“ anpassen und dann ausschneiden.

3. So fügen Sie einem Bild ein Wasserzeichen hinzu

Das Hinzufügen eines Wasserzeichens ist hier nicht so einfach Die Hauptsache ist, die Position des Wasserzeichens auf dem Bild zu steuern und die Größe des Wasserzeichens im Bild zu steuern. Wenn beispielsweise die Größe des Zielbilds und des Wasserzeichenbilds nahe beieinander liegen, müssen Sie zunächst das Wasserzeichenbild proportional skalieren und dann das Wasserzeichenbild hinzufügen.

Die beiden Bilder links, oben das Originalbild, unten das mit Wasserzeichen versehene Bild und rechts das neue Bild nach der Skalierung und dem Hinzufügen von Wasserzeichen.

4. Klassendiagramm


5. PHP-Code

5.1. Konstruktor __construct()


Mit Ausnahme des Konstruktors __construct(), der öffentlich ist, sind andere Funktionen privat In der Funktion __construct() werden die Funktionen zum Generieren von Miniaturansichten und zum Hinzufügen von Wasserzeichen direkt ausgeführt. Wenn Sie nur Miniaturansichten generieren, ohne ein Wasserzeichen hinzuzufügen, setzen Sie den Parameter $markPath von __construct() direkt auf null.

Darunter „$this->quality = $quality ? $quality : 75;“ Wenn Sie die Ausgabe in ein JPG-Bild steuern, steuern Sie die Bildqualität (0-100), der Standardwert ist 75 ;

  /**
   * Image constructor.
   * @param string $imagePath 图片路径
   * @param string $markPath 水印图片路径
   * @param int $new_width 缩略图宽度
   * @param int $new_height 缩略图高度
   * @param int $quality JPG图片格输出质量
   */
  public function __construct(string $imagePath,
                string $markPath = null,
                int $new_width = null,
                int $new_height = null,
                int $quality = 75)
  {
    $this->imgPath = $_SERVER[&#39;DOCUMENT_ROOT&#39;] . $imagePath;
    $this->waterMarkPath = $markPath;
    $this->newWidth = $new_width ? $new_width : $this->width;
    $this->newHeight = $new_height ? $new_height : $this->height;
    $this->quality = $quality ? $quality : 75;

    list($this->width, $this->height, $this->type) = getimagesize($this->imgPath);
    $this->img = $this->_loadImg($this->imgPath, $this->type);


    //生成缩略图
    $this->_thumb();
    //添加水印图片
    if (!empty($this->waterMarkPath)) $this->_addWaterMark();
    //输出图片
    $this->_outputImg();
  }
Nach dem Login kopieren

Note: 先生成缩略图,再在新图上添加水印 图片。

5.2. 生成缩略图函数_thumb()

   /**
   * 缩略图(按等比例,根据设置的宽度和高度进行裁剪)
   */
  private function _thumb()
  {

    //如果原图本身小于缩略图,按原图长高
    if ($this->newWidth > $this->width) $this->newWidth = $this->width;
    if ($this->newHeight > $this->height) $this->newHeight = $this->height;

    //背景图长高
    $gd_width = $this->newWidth;
    $gd_height = $this->newHeight;

    //如果缩略图宽高,其中有一边等于原图的宽高,就直接裁剪
    if ($gd_width == $this->width || $gd_height == $this->height) {
      $this->newWidth = $this->width;
      $this->newHeight = $this->height;
    } else {

      //计算缩放比率
      $per = 1;

      if (($this->newHeight / $this->height) > ($this->newWidth / $this->width)) {
        $per = $this->newHeight / $this->height;
      } else {
        $per = $this->newWidth / $this->width;
      }

      if ($per < 1) {
        $this->newWidth = $this->width * $per;
        $this->newHeight = $this->height * $per;
      }
    }

    $this->newImg = $this->_CreateImg($gd_width, $gd_height, $this->type);
    imagecopyresampled($this->newImg, $this->img, 0, 0, 0, 0, $this->newWidth, $this->newHeight, $this->width, $this->height);
  }
Nach dem Login kopieren

生成缩略图函数_thumb() ,是按照前面的分析来进行编码。

5.3. 添加水印图片函数 _addWaterMark()

   /**
   * 添加水印
   */
  private function _addWaterMark()
  {
    $ratio = 1 / 5; //水印缩放比率

    $Width = imagesx($this->newImg);
    $Height = imagesy($this->newImg);

    $n_width = $Width * $ratio;
    $n_height = $Width * $ratio;

    list($markWidth, $markHeight, $markType) = getimagesize($this->waterMarkPath);

    if ($n_width > $markWidth) $n_width = $markWidth;
    if ($n_height > $markHeight) $n_height = $markHeight;

    $Img = $this->_loadImg($this->waterMarkPath, $markType);
    $Img = $this->_thumb1($Img, $markWidth, $markHeight, $markType, $n_width, $n_height);
    $markWidth = imagesx($Img);
    $markHeight = imagesy($Img);
    imagecopyresampled($this->newImg, $Img, $Width - $markWidth - 10, $Height - $markHeight - 10, 0, 0, $markWidth, $markHeight, $markWidth, $markHeight);
    imagedestroy($Img);
  }
Nach dem Login kopieren

在添加水印图片中,用到一个_thumb1()函数来缩放水印图片:

  /**
   * 缩略图(按等比例)
   * @param resource $img 图像流
   * @param int $width
   * @param int $height
   * @param int $type
   * @param int $new_width
   * @param int $new_height
   * @return resource
   */
  private function _thumb1($img, $width, $height, $type, $new_width, $new_height)
  {

    if ($width < $height) {
      $new_width = ($new_height / $height) * $width;
    } else {
      $new_height = ($new_width / $width) * $height;
    }

    $newImg = $this->_CreateImg($new_width, $new_height, $type);
    imagecopyresampled($newImg, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    return $newImg;
  }
Nach dem Login kopieren

5.4. 完整代码:

<?php

/**
 * 图片处理,生成缩略图和添加水印图片
 * Created by PhpStorm.
 * User: andy
 * Date: 17-1-3
 * Time: 上午11:55
 */
class Image
{
 //原图
 private $imgPath; //图片地址
 private $width;  //图片宽度
 private $height; //图片高度
 private $type;  //图片类型
 private $img;  //图片(图像流)

 //缩略图
 private $newImg; //缩略图(图像流)
 private $newWidth;
 private $newHeight;

 //水印图路径
 private $waterMarkPath;

 //输出图像质量,jpg有效
 private $quality;

 /**
  * Image constructor.
  * @param string $imagePath 图片路径
  * @param string $markPath 水印图片路径
  * @param int $new_width 缩略图宽度
  * @param int $new_height 缩略图高度
  * @param int $quality JPG图片格输出质量
  */
 public function __construct(string $imagePath,
        string $markPath = null,
        int $new_width = null,
        int $new_height = null,
        int $quality = 75)
 {
  $this->imgPath = $_SERVER[&#39;DOCUMENT_ROOT&#39;] . $imagePath;
  $this->waterMarkPath = $markPath;
  $this->newWidth = $new_width ? $new_width : $this->width;
  $this->newHeight = $new_height ? $new_height : $this->height;
  $this->quality = $quality ? $quality : 75;

  list($this->width, $this->height, $this->type) = getimagesize($this->imgPath);
  $this->img = $this->_loadImg($this->imgPath, $this->type);


  //生成缩略图
  $this->_thumb();
  //添加水印图片
  if (!empty($this->waterMarkPath)) $this->_addWaterMark();
  //输出图片
  $this->_outputImg();
 }

 /**
  *图片输出
  */
 private function _outputImg()
 {
  switch ($this->type) {
   case 1: // GIF
    imagegif($this->newImg, $this->imgPath);
    break;
   case 2: // JPG
    if (intval($this->quality) < 0 || intval($this->quality) > 100) $this->quality = 75;
    imagejpeg($this->newImg, $this->imgPath, $this->quality);
    break;
   case 3: // PNG
    imagepng($this->newImg, $this->imgPath);
    break;
  }
  imagedestroy($this->newImg);
  imagedestroy($this->img);
 }

 /**
  * 添加水印
  */
 private function _addWaterMark()
 {
  $ratio = 1 / 5; //水印缩放比率

  $Width = imagesx($this->newImg);
  $Height = imagesy($this->newImg);

  $n_width = $Width * $ratio;
  $n_height = $Width * $ratio;

  list($markWidth, $markHeight, $markType) = getimagesize($this->waterMarkPath);

  if ($n_width > $markWidth) $n_width = $markWidth;
  if ($n_height > $markHeight) $n_height = $markHeight;

  $Img = $this->_loadImg($this->waterMarkPath, $markType);
  $Img = $this->_thumb1($Img, $markWidth, $markHeight, $markType, $n_width, $n_height);
  $markWidth = imagesx($Img);
  $markHeight = imagesy($Img);
  imagecopyresampled($this->newImg, $Img, $Width - $markWidth - 10, $Height - $markHeight - 10, 0, 0, $markWidth, $markHeight, $markWidth, $markHeight);
  imagedestroy($Img);
 }

 /**
  * 缩略图(按等比例,根据设置的宽度和高度进行裁剪)
  */
 private function _thumb()
 {

  //如果原图本身小于缩略图,按原图长高
  if ($this->newWidth > $this->width) $this->newWidth = $this->width;
  if ($this->newHeight > $this->height) $this->newHeight = $this->height;

  //背景图长高
  $gd_width = $this->newWidth;
  $gd_height = $this->newHeight;

  //如果缩略图宽高,其中有一边等于原图的宽高,就直接裁剪
  if ($gd_width == $this->width || $gd_height == $this->height) {
   $this->newWidth = $this->width;
   $this->newHeight = $this->height;
  } else {

   //计算缩放比率
   $per = 1;

   if (($this->newHeight / $this->height) > ($this->newWidth / $this->width)) {
    $per = $this->newHeight / $this->height;
   } else {
    $per = $this->newWidth / $this->width;
   }

   if ($per < 1) {
    $this->newWidth = $this->width * $per;
    $this->newHeight = $this->height * $per;
   }
  }

  $this->newImg = $this->_CreateImg($gd_width, $gd_height, $this->type);
  imagecopyresampled($this->newImg, $this->img, 0, 0, 0, 0, $this->newWidth, $this->newHeight, $this->width, $this->height);
 }


 /**
  * 缩略图(按等比例)
  * @param resource $img 图像流
  * @param int $width
  * @param int $height
  * @param int $type
  * @param int $new_width
  * @param int $new_height
  * @return resource
  */
 private function _thumb1($img, $width, $height, $type, $new_width, $new_height)
 {

  if ($width < $height) {
   $new_width = ($new_height / $height) * $width;
  } else {
   $new_height = ($new_width / $width) * $height;
  }

  $newImg = $this->_CreateImg($new_width, $new_height, $type);
  imagecopyresampled($newImg, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
  return $newImg;
 }

 /**
  * 加载图片
  * @param string $imgPath
  * @param int $type
  * @return resource
  */
 private function _loadImg($imgPath, $type)
 {
  switch ($type) {
   case 1: // GIF
    $img = imagecreatefromgif($imgPath);
    break;
   case 2: // JPG
    $img = imagecreatefromjpeg($imgPath);
    break;
   case 3: // PNG
    $img = imagecreatefrompng($imgPath);
    break;
   default: //其他类型
    Tool::alertBack(&#39;不支持当前图片类型.&#39; . $type);
    break;
  }
  return $img;
 }

 /**
  * 创建一个背景图像
  * @param int $width
  * @param int $height
  * @param int $type
  * @return resource
  */
 private function _CreateImg($width, $height, $type)
 {
  $img = imagecreatetruecolor($width, $height);
  switch ($type) {
   case 3: //png
    imagecolortransparent($img, 0); //设置背景为透明的
    imagealphablending($img, false);
    imagesavealpha($img, true);
    break;
   case 4://gif
    imagecolortransparent($img, 0);
    break;
  }

  return $img;
 }
}
Nach dem Login kopieren

6.调用

调用非常简单,在引入类后,直接new 并输入对应参数即可:

e.g.

new Image($_path, MARK, 400, 200, 100);

7.小结
这个Image 类能够生成缩略图,不出现黑边,添加水印图,能根据图片的大小缩放水印图。当然有个缺点,就是不能缩放GIF的动画,因为涉及到帧的处理,比较麻烦。

以上就是本文的全部内容,希望对大家的学习有所帮助。


相关推荐:

PHP实现水印类,支持添加图片、文字、填充颜色区域

thinkPHP框架实现图像裁剪、缩放、加水印的方法详解

PHP实现随机生成水印图片功能的方法

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Erstellung von PHP-Miniaturansichten und Bildwasserzeichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!