如何用PHP为图片添加居中倾斜45°的Logo水印?
实现PHP图片水印45度倾斜居中对角放置
要实现图片水印45度倾斜并居中对角放置的效果,你需要借助GD库的imagerotate函数先旋转水印,同时处理旋转后的画布尺寸与透明属性,再将旋转后的水印复制到基础图片的对应位置。以下是修改后的完整代码:
<?php header('content-type: image/jpeg'); $poster_img = dirname(__FILE__) . '/base.jpeg'; $water_img = dirname(__FILE__) . '/watermark.png'; // 获取基础图片和水印的尺寸 list($poster_width, $poster_height) = getimagesize($poster_img); list($water_width, $water_height) = getimagesize($water_img); // 创建基础图片和水印的资源 $posterimage = imagecreatefromjpeg($poster_img); $watermark = imagecreatefrompng($water_img); // 计算45度旋转后水印画布的尺寸(避免旋转后内容被裁剪) $angle = 45; $rad = deg2rad($angle); $new_water_width = (int)($water_width * abs(cos($rad)) + $water_height * abs(sin($rad))); $new_water_height = (int)($water_width * abs(sin($rad)) + $water_height * abs(cos($rad))); // 创建支持透明的旋转后画布 $rotated_watermark = imagecreatetruecolor($new_water_width, $new_water_height); imagealphablending($rotated_watermark, false); imagesavealpha($rotated_watermark, true); $transparent = imagecolorallocatealpha($rotated_watermark, 255, 255, 255, 127); imagefill($rotated_watermark, 0, 0, $transparent); // 旋转水印(-45表示逆时针旋转45度,适配对角倾斜需求) $rotated = imagerotate($watermark, -$angle, $transparent); // 将旋转后的水印复制到新画布的居中位置 imagecopy($rotated_watermark, $rotated, ($new_water_width - imagesx($rotated)) / 2, ($new_water_height - imagesy($rotated)) / 2, 0, 0, imagesx($rotated), imagesy($rotated)); // 计算旋转后水印在基础图片上的居中位置 $x = ($poster_width - $new_water_width) / 2; $y = ($poster_height - $new_water_height) / 2; // 将旋转后的水印复制到基础图片 imagecopy($posterimage, $rotated_watermark, $x, $y, 0, 0, $new_water_width, $new_water_height); // 输出并保存图片 imagejpeg($posterimage, 'watermarked_image.jpg'); // 销毁所有资源 imagedestroy($posterimage); imagedestroy($watermark); imagedestroy($rotated_watermark); imagedestroy($rotated); ?>
关键步骤说明:
- 计算旋转后画布尺寸:由于图片旋转45度后,原内容会超出原画布范围,通过三角函数计算新画布的宽高,确保旋转后的水印完整显示。
- 透明属性处理:创建旋转画布时开启透明保存,并用全透明色填充背景,避免旋转后出现白色底色。
- 旋转与居中:使用
imagerotate旋转水印,再将旋转后的水印居中放置到新画布中,最后计算基础图片上的居中位置完成复制。
内容的提问来源于stack exchange,提问作者Abdu ssamad
相关产品推荐
相关产品推荐

