php - 我的 php 水印功能不适用于 png 图像
问题描述
我正在使用 PHP 函数将我的徽标添加为我网站上上传的图像的水印。但我不知道为什么我的水印功能不适用于 png 文件。但是,它完美地适用于 jpeg 文件。这是我的 PHP 函数。
function watermark($img) {
global $wm_file, $wm_right, $wm_bottom;
// image values pulled from config.inc.php
$logo = './images/' . $wm_file; // path to the watermark.png
$sp = $wm_right; // spacing from right side
$sq = $wm_bottom; // spacing from bottom
$size = getImageSize($img);
$sizel = getImageSize($logo);
$imgA = imageCreateFromJpeg($img);
imageAlphaBlending($imgA, TRUE);
if($sizel[0] > $size[0] || $sizel[1] > $size[1])
{
// logo size > img size
$sizelo[0] = $sizel[0];
$sizelo[1] = $sizel[1];
$sizel[0] = ($sizel[0]/2);
$sizel[1] = ($sizel[1]/2);
}
else
{
$sizelo[0] = $sizel[0];
$sizelo[1] = $sizel[1];
}
$imgBa = imageCreateFromPng($logo);
$imgB = imageCreateTrueColor($sizel[0], $sizel[1]);
imageAlphaBlending($imgB, TRUE);
imageCopyResampled($imgB, $imgBa, 0, 0, 0, 0, $sizel[0], $sizel[1], $sizelo[0], $sizelo[1]);
imageColorTransparent($imgB, ImageColorAllocate($imgB, 0, 0, 0));
$perc = 100;
imageCopymerge($imgA, $imgB, ($size[0]-$sizel[0]-$sp), ($size[1]-$sizel[1]-$sq), 0, 0, $sizel[0], $sizel[1], $perc);
unlink($img);
if(imageJpeg($imgA, $img, 100))
{
imageDestroy($imgB);
imageDestroy($imgA);
return true;
}
chmod($img, 0777);
}
解决方案
我看到的问题是您正在使用作为为您传递给函数imageCreateFromJpeg()
的资源生成资源的方式。$img
如果您通过该函数传递一个 jpeg,它将起作用。如果你传递一个 png 它不会。
我建议使用imagecreatefromstring()
它来创建所有资源,因为它不依赖于文件类型。像这样:
$source = imagecreatefromstring(file_get_contents($filePath));
这样做的另一个好处是,如果函数无法从您提供的文件路径创建资源,则它将返回 false,这意味着该文件不是图像文件。
现在您已经拥有可用于其余代码的资源,imageJpeg()
将资源作为 jpeg 保存回文件路径。
希望有帮助。
另一个旁注。如果您打算使用 bmp 图像,GD 库没有用于 bmps 的内置函数。但是在 PHP.net 上,确实有人写了一个createimagefromBMP()
效果很好的。另外我认为,在最新版本的 PHP 中,GD 库现在确实有一个createimagefromBMP()
功能。
我还看到您正在使用unlink()
从目录中删除图像。这不是必需的,原因有两个。imageJpeg()
只会覆盖原来的。此外,如果由于某种原因您的脚本失败,它可能会过早地删除图像,并且您将丢失图像而不会写入新图像。
使用时请小心,请chmod()
务必确保在完成后将权限设置回原始权限。
chmod($img, 777); //Give broad permissions.
//Do something.
chmod($img, 600(or whatever they were)); //Reset permission back to where they were before you changed them.
推荐阅读
- java - 我有一个不正确的查询,但我找不到错误
- java - Spring Boot 和 JavaFX,使用 WeaverFX
- typescript - 在 TypeScript 中检查文字对象类型的更简单方法
- c# - 我们是否允许在启用 Mono 解释器的情况下发布 Xamarin iOS 应用程序?
- node.js - 在 node.js 中跟踪当前活跃用户
- php - 在 WordPress 管理仪表板中更改 WooCommerce 产品菜单标题
- ios - 用户从 UIPickerView 选择值后如何启用按钮?
- sql - SQL Server 代理作业和 SSIS 项目
- javascript - 引导卡页脚通过滑动动画上下移动
- mysql - SQL:计算行数并返回最大计数的所有行:无效使用组函数