在php中调整动态水印png的大小

Posted

技术标签:

【中文标题】在php中调整动态水印png的大小【英文标题】:Resizing a dynamic watermark png in php 【发布时间】:2012-08-09 19:13:38 【问题描述】:

我正在尝试自动调整水印的大小以覆盖图像的 1/4。我有水印代码工作,但我不能让它正确调整大小。

<?php

$image = $_GET['src'];
$path_parts = pathinfo($image);
$extension=strtolower($path_parts['extension']);
$size = (imagesx($image)/2);

$stamp = ImageCreateFromPNG("watermark.png"); 
ImageAlphaBlending($stamp,true); 
ImageSaveAlpha($stamp,true); 



$w = imagesx($stamp); 
$h = imagesy($stamp); 

if( $w==0 or $h==0 ) die("ERROR - zero image size"); 

$percent = $size / (($w>$h)?$w:$h); 
$nw = intval($w*$percent); 
$nh = intval($h*$percent); 

$stamp_resized = ImageCreateTrueColor($nw,$nh); 

ImageAlphaBlending($stamp_resized,false); 
ImageSaveAlpha($stamp_resized,true); 

if(!empty($transparent_color)) 
 
    $transparent_new = ImageColorAllocate($stamp_resized,$transparent_color['red'],$transparent_color['green'],$transparent_color['blue']); 
    $transparent_new_index = ImageColorTransparent($stamp_resized,$transparent_new); 
    ImageFill($stamp_resized, 0,0, $transparent_new_index); 
 

if(ImageCopyResized($stamp_resized,$stamp, 0,0,0,0, $nw,$nh, $w,$h )) 
 
    ImageDestroy($stamp); 
    $stamp = $stamp_resized; 
 




//Everything from here on works perfect
if(file_exists($image))
    if ($extension == 'gif')$im = imagecreatefromgif($_GET['src']);
    if ($extension == 'jpg')  

        $im = imagecreatefromjpeg($_GET['src']);

        $marge_right = 10;
        $marge_bottom = 10;
        $sx = imagesx($stamp);
        $sy = imagesy($stamp);


        imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, $sx, $sy);

    

else
$im = imagecreatefromgif('images/no_picture.gif');




// Output and free memory
header('Content-type: image/jpeg');
imagejpeg($im);  
imagedestroy($im);
?>

我检查了错误日志,发现了这些错误:

[Thu Aug 09 16:47:05 2012] [error] [client 24.224.164.149] PHP Warning:  imagesx() expects parameter 1 to be resource, string given in path removed/watermark.php on line 15

[Thu Aug 09 16:47:05 2012] [error] [client 24.224.164.149] PHP Warning:  imagecreatetruecolor(): Invalid image dimensions in path removed/watermark.php on line 32

[Thu Aug 09 16:47:05 2012] [error] [client 24.224.164.149] PHP Warning:  imagealphablending() expects parameter 1 to be resource, boolean given in path removed/watermark.php on line 34

[Thu Aug 09 16:47:05 2012] [error] [client 24.224.164.149] PHP Warning:  imagesavealpha() expects parameter 1 to be resource, boolean given in path removed/watermark.phpp on line 35

[Thu Aug 09 16:47:05 2012] [error] [client 24.224.164.149] PHP Warning:  imagecopyresized() expects parameter 1 to be resource, boolean given in path removed/watermark.php on line 44

【问题讨论】:

【参考方案1】:

原来我传递 imagesx 是图像 ($image) 的路径,而不是图像资源 ($im) 本身。我重新编写了代码,以便在调整图像大小之前加载 jpg。

这修复了所有级联错误,现在可以正常工作了。故事的道德,检查错误日志。

【讨论】:

【参考方案2】:

看起来像

 $size = (imagesx($image)/2);

可能是您的问题,因为 imagesx 需要由图像创建函数生成的图像资源,并且您给了它一个 src。

【讨论】:

就是这样。我给它的是路径,而不是资源

以上是关于在php中调整动态水印png的大小的主要内容,如果未能解决你的问题,请参考以下文章

PHP图像动态调整大小和圆角图像

如何在 PHP 中调整具有透明度的 png 大小?

使用 php Imagick 保留背景调整 PNG 的大小

使用gd在php中调整图像大小后的黑色背景

PHP调整图像大小并保存为透明PNG

PHP图像动态调整大小与存储调整大小的图像