Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung der Erstellung von PHP-Miniaturansichten und Bildwasserzeichen
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.
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 d2a3b17d1866cd9934482ccd8f21e81c= Originalbildhöhe“, dann legen Sie zuerst „Neue Bildhöhe“ fest = Höhe des Originalbildes“ anpassen und dann ausschneiden. Szenario 6, wenn „Neue Bildhöhe 0f6444a7cc4fa351f7a0cd76001397c1= 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['DOCUMENT_ROOT'] . $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(); }
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); }
生成缩略图函数_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); }
在添加水印图片中,用到一个_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; }
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['DOCUMENT_ROOT'] . $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('不支持当前图片类型.' . $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; } }
6.调用
调用非常简单,在引入类后,直接new 并输入对应参数即可:
e.g.
new Image($_path, MARK, 400, 200, 100);
7.小结
这个Image 类能够生成缩略图,不出现黑边,添加水印图,能根据图片的大小缩放水印图。当然有个缺点,就是不能缩放GIF的动画,因为涉及到帧的处理,比较麻烦。
以上就是本文的全部内容,希望对大家的学习有所帮助。
相关推荐:
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!