带有水印的PHP图片上传

3
我有一段上传水印图片的代码,这段代码运行良好,但是水印函数会重新调整上传的所有图片到较小的宽度和高度。我想要在添加水印后保持原尺寸。我相信问题出在函数中,但我不知道该如何修复。
if(isset($_FILES)){
    $file = $_FILES['image'];
    $allowedExts = array('jpg','png','gif','jpeg');
    $uploadsDirectory = "imgupload/";
    $maxSize = 2000000;

    for($i = 0; $i < count($file['name']); $i++){
        $filetmpname = $file['tmp_name'][$i];       
        $errors = array();
        $filename = $file['name'][$i];
        $filetext = strtolower(end(explode('.',$filename)));
        $filesize = $file['size'][$i];
        $filetmpname = $file['tmp_name'][$i];

        if(in_array($filetext, $allowedExts) === FALSE){
            $errors[] = "Extension is not allowed"; 
        }

        if($filesize > $maxSize){
            $errors[] = "File Size must be less than {$maxSize} KB";
        }

        if(empty($errors)){   
            $random = rand(0,199);
            $destination = $file['name'][$i] = $uploadsDirectory. $random."_".date("d-m-Y") . "_" . $file['name'][$i];
            $upload_status = move_uploaded_file($filetmpname, $destination);  

            if($upload_status){
                $new_name = $uploadsDirectory.$random."_".date("d-m-Y") . "_" .".jpg";
                if(watermark_image($destination, $new_name))
                    $demo_image = $new_name;
            }
        }
    }
}

水印功能:

$image_path = "images/water.png"; 

function watermark_image($oldimage_name, $new_image_name)
    {
        global $image_path;
        list($owidth,$oheight) = getimagesize($oldimage_name);
        $width = $height = 300;    
        $im = imagecreatetruecolor($width, $height);
        $img_src = imagecreatefromjpeg($oldimage_name);
        imagecopyresampled($im, $img_src, 0, 0, 0, 0, $width, $height, $owidth, $oheight);
        $watermark = imagecreatefrompng($image_path);
        list($w_width, $w_height) = getimagesize($image_path);        
        $pos_x = $width - $w_width; 
        $pos_y = $height - $w_height;
        imagecopy($im, $watermark, $pos_x, $pos_y, 0, 0, $w_width, $w_height);
        imagejpeg($im, $new_image_name, 100);
        imagedestroy($im);
        unlink($oldimage_name);
        return true;
    } 
1个回答

3
您正在获取现有图像的大小:

list($owidth,$oheight) = getimagesize($oldimage_name);
$width = $height = 300;    

这是它生成不同尺寸图片的位置:
imagecopyresampled($im, $img_src, 0, 0, 0, 0, $width, $height, $owidth, $oheight);

http://php.net/manual/en/function.imagecopyresampled.php


这个水印功能我在其他网站上找到并添加到我的代码中,但是图片大小被重新调整了,我不知道如何解决这个问题。请帮帮我,@ryantxr。 - Wilian Brain
请查看PHP文档。您将看到该函数的完整描述以及它如何进行图像调整。 - ryantxr
调整大小的问题现在已经解决了,但我又遇到了另一个问题,如果图片是PNG或GIF格式,它会显示“不是有效的PNG文件”或“不是有效的JPG文件”。 如何在$img_src = imagecreatefromjpeg($oldimage_name);中解决这个问题? - Wilian Brain
不要更改问题。如果答案解决了您的问题,请接受答案并提出新问题。 - ryantxr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接