php 之添加图片水印,根据比例计算水印的新尺寸

devtools/2024/11/14 4:02:25/

以下是 `_imgWatermark` 函数的中文注释和解析。该函数用于在图像上添加水印:

php">function _imgWatermark($src_image, $water_image, $path_image = '', $position = 10, $pct = 30, $angle = 15)
{// 检查源图和水印图文件是否存在if (!is_file($src_image)) {$error = '源图不存在';return false;}if (!is_file($water_image)) {$error = '水印图不存在';return false;}// 获取图片信息$src_info = getimagesize($src_image);$water_info = getimagesize($water_image);// 定义允许的图片 MIME 类型$allow = array('image/jpeg' => 'jpeg','image/gif' => 'gif','image/jpg' => 'jpg','image/png' => 'png','image/pjpeg' => 'jpeg');// 检查图像类型是否被允许if (!array_key_exists($src_info['mime'], $allow)) {$error = "源图类型不支持添加水印";return false;}if (!array_key_exists($water_info['mime'], $allow)) {$error = "水印图类型不支持";return false;}// 根据 MIME 类型创建打开和保存图片的函数$src_open = 'imagecreatefrom' . $allow[$src_info['mime']];$water_open = 'imagecreatefrom' . $allow[$water_info['mime']];$src_save = 'image' . $allow[$src_info['mime']];// 打开图像资源$src = $src_open($src_image);$water = $water_open($water_image);// 根据比例计算水印的新尺寸$scale_factor = 0.15; // 水印的相对大小比例$new_water_width = $src_info[0] * $scale_factor;$new_water_height = ($water_info[1] / $water_info[0]) * $new_water_width;// 创建缩放后的水印图$resized_water = imagecreatetruecolor($new_water_width, $new_water_height);imagealphablending($resized_water, false);imagesavealpha($resized_water, true);imagecopyresampled($resized_water, $water, 0, 0, 0, 0, $new_water_width, $new_water_height, $water_info[0], $water_info[1]);// 释放原始水印资源,使用缩放后的水印imagedestroy($water);$water = $resized_water;$water_info[0] = $new_water_width;$water_info[1] = $new_water_height;if ($angle) {// 旋转水印图片$water = imagerotate($water, $angle, imageColorAllocateAlpha($water, 0, 0, 0, 127));// 获取旋转后的水印尺寸$sourceInfo[0] = imagesx($water);$sourceInfo[1] = imagesy($water);// 设置水印平铺的间距$ww = $src_info[0] * 0.1;  // 水平方向间距$hh = $src_info[1] * 0.1;  // 垂直方向间距}if ($position == 10) {$offset_x = $water_info[0] / 2;}// 计算水印在源图中的位置$start_x = $start_y = 0;switch ($position) {case 1:break;case 2:$start_x = floor(($src_info[0] - $water_info[0]) / 2);break;case 3:$start_x = $src_info[0] - $water_info[0];break;case 4:$start_y = floor(($src_info[1] - $water_info[1]) / 2);break;case 5:$start_x = floor(($src_info[0] - $water_info[0]) / 2);$start_y = floor(($src_info[1] - $water_info[1]) / 2);break;case 6:$start_x = $src_info[0] - $water_info[0];$start_y = floor(($src_info[1] - $water_info[1]) / 2);break;case 7:$start_y = $src_info[1] - $water_info[1];break;case 8:$start_x = floor(($src_info[0] - $water_info[0]) / 2);$start_y = $src_info[1] - $water_info[1];break;case 9:$start_x = $src_info[0] - $water_info[0];$start_y = $src_info[1] - $water_info[1];break;case 10:// 创建用于平铺的图像资源$fun = 'imagecreatefrom' . image_type_to_extension($src_info[2], false);$thumb = $fun($src_image);// 定义总长度$start_x = $src_info[0] - 0;$start_y = $src_info[1] - 0;$index = 0;$ccasd = 0;$ccasdy = 0;// 循环平铺水印for ($x = 0; $x < $start_x; $x) {for ($y = 0; $y < $start_y; $y) {if ($x == 0 && $y == 0) {$x = round($ww / 2);}$index++;imagecopy($src, $thumb, 0, 0, $x + $ccasd - $offset_x, $y + $ccasdy, $sourceInfo[0], $sourceInfo[1]);imagecopy($src, $water, 0, 0, 0, 0, $sourceInfo[0], $sourceInfo[1]);imagecopymerge($thumb, $src, $x + $ccasd - $offset_x, $y + $ccasdy, 0, 0, $sourceInfo[0], $sourceInfo[1], $pct);$y += $sourceInfo[1] + $hh;}$x += $sourceInfo[0] + $ww;$index = 0;}$src_save($thumb, $path_image);imagedestroy($src);imagedestroy($water);return $imagename;break;}// 合并水印到源图if (imagecopymerge($src, $water, $start_x, $start_y, 0, 0, $water_info[0], $water_info[1], $pct) && $position != 10) {$src_save($src, $path_image);imagedestroy($src);imagedestroy($water);return $imagename;} else {$error = "水印制作失败";return false;}
}

### 关键点:

- **文件存在性检查:** 确保源图和水印图文件存在。
- **支持的图像类型:** 验证图像是否属于支持的类型(JPEG、GIF、PNG)。
- **图像缩放:** 根据比例缩放水印图,使其相对于源图的尺寸更小。
- **水印位置:** 水印可以根据 `position` 参数被放置在源图的不同位置。
- **水印平铺:** 如果 `position` 设置为 10,水印将在整个图像上平铺。
- **透明度和旋转:** 水印可以通过 `angle` 和 `pct` 参数进行旋转和调整透明度。
- **资源管理:** 函数确保所有图像资源在使用后被销毁以释放内存。

该函数为图像添加水印提供了灵活的方式,允许用户自定义水印的位置、透明度和平铺方式。


http://www.ppmy.cn/devtools/133822.html

相关文章

基于C++实现(图形化界面)CLOCK置换算法

一、课程设计目的 《操作系统》是一门重要的专业基础课&#xff0c;是涉及较多硬件知识的计算机系统软件课程。在计算机软硬件课程的设置上&#xff0c;它起着承上启下的作用。操作系统对计算机系统资源实施管理&#xff0c;是所有其他软件与计算机硬件的唯一接口&#xff0c;…

ONLYOFFICE8.2版本测评,团队协作的办公软件

文章目录 引言ONLYOFFICE产品简介功能与特点1. 实时协作2. 兼容性3. 模板库4. 评论和修订5. 安全性 体验与测评功能测试 邀请用户使用项目介绍结尾了解更多 引言 在数字化办公的浪潮中&#xff0c;效率和协作成为了工作的核心。ONLYOFFICE作为一个强大的办公套件&#xff0c;正…

【Android、IOS、Flutter、鸿蒙、ReactNative 】约束布局

Android XML 约束布局 参考 TextView居中 TextView 垂直居中并且靠右 TextView 宽高设置百分比 宽和高的比例 app:layout_constraintDimensionRatio"h,2:1" 表示子视图的宽高比为2:1&#xff0c;其中 h表示保持宽度不变&#xff0c;高度自动调整。 最大宽度 设…

mybatis+postgresql,无感读写json字段

1.实体类中字段类型 import com.alibaba.fastjson.JSONObject;Data public class TestDto {private String name;//对应数据库的JSON字段private JSONObject page_detail;} 2.自定义实现typeHandler package base.utils;import com.alibaba.fastjson.JSONObject; import org…

Vue.js 高质量翻页功能的完整开发指南

文章目录 Vue.js 翻页组件的完整开发与优化指南前言分析分页需求与设计要点基础分页功能的实现分页逻辑 优化分页&#xff1a;封装为组件化设计组件化代码 提升用户体验与性能动态调整每页显示的条目数优化移动端与桌面端的展示高性能翻页策略&#xff1a;按需加载与懒加载提示…

气爪在自动化装配线中是如何应用的?

气爪在自动化装配线中的应用是现代工业自动化中的一个重要组成部分&#xff0c;它们以其高效、精确和可靠的性能&#xff0c;显著提升了生产效率和产品质量。 在自动化装配的世界里&#xff0c;气爪以其灵活性和精确性&#xff0c;成为生产线上不可或缺的工具。它的核心部件包括…

乐维网管平台(六):如何正确管理设备端口

一、什么是端口下联 在网络环境中&#xff0c;端口下联是指网络设备&#xff08;通常是交换机&#xff09;的端口与其他设备相连接的一种网络架构关系。交换机作为网络中的核心连接设备&#xff0c;其端口下联可以连接多种类型的终端设备&#xff0c;如计算机、服务器、IP 电话…

Android 13.0 framework系统修改安兔兔等显示的屏幕尺寸大小功能实现

1.前言 在13.0的系统rom定制化开发中,在使用第三方app检测系统的一些信息中,比如安兔兔 设备信息等检测app中,有时候显示的屏幕尺寸大小和 产品规格书等信息不同,稍微有些差异,所以就需要看下系统framework层中,相关的设备信息是怎么读出来的,然后做些调整 接下来就来分…