PHP水印图像

时间:2015-09-12 15:27:53

标签: php image-processing watermark

我正在尝试在上传时为图片添加水印。

我有一个多上传脚本,可以正常工作,见下文:

GET

是否可以为使用我的脚本上传的所有图像添加水印?

2 个答案:

答案 0 :(得分:2)

关闭主题,但已请求,希望它有助于某人从mysql_*PDObindParam的PDO手册页,至少指向某个地方。

模式

create table commerce_images 
(   `id` int auto_increment primary key,
    `USER_ID` int not null,
    `FILE_NAME` varchar(123) not null,
    `FILE_SIZE` int not null,
    `FILE_TYPE` int not null, 
    `added_by` varchar(100), 
    `gallery_id` int not null, 
    `sub_gallery_id` int not null
);

PHP

<?php
    // Begin Vault (this is in a vault, not actually hard-coded)
    $host="localhost";
    $username="GuySmiley";
    $password="anchovies_¿^?fish╔&®";
    $dbname="so_gibberish";
    // End Vault

    try {

        $dbh = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $user=456;
        $file_name="/path";
        $file_size=29832;
        $file_type=3;
        $Fname="Kim";
        $Sname="Billings";
        $gallery=35;
        $album=9;

        $FullName="$Fname $Sname";

        // prepared statement with named placeholders for sanity of not using index values of placeholders
        $stmt = $dbh->prepare("INSERT into commerce_images (`USER_ID`,`FILE_NAME`,`FILE_SIZE`,`FILE_TYPE`, `added_by`, `gallery_id`, `sub_gallery_id`) 
        VALUES(:user,:file_name,:file_size,:file_type,:FullName,:gallery,:album)");
        $stmt->bindParam(':user', $user, PDO::PARAM_INT);   // correct this datatype
        $stmt->bindParam(':file_name', $file_name, PDO::PARAM_STR,123); // size it
        $stmt->bindParam(':file_size', $file_size, PDO::PARAM_INT);
        $stmt->bindParam(':file_type', $file_type, PDO::PARAM_INT); // correct this datatype
        $stmt->bindParam(':FullName', $FullName, PDO::PARAM_STR,123);   // size it
        $stmt->bindParam(':gallery', $gallery, PDO::PARAM_INT); // correct this datatype
        $stmt->bindParam(':album', $album, PDO::PARAM_INT); // correct this datatype
        $stmt->execute();

        $stmt = null;
        // PDO closes connection at end of script

    } catch (PDOException $e) {
        echo 'PDO Exception: ' . $e->getMessage();
        exit();
    }
?>

结果

select * from commerce_images;
+----+---------+-----------+-----------+-----------+--------------+------------+----------------+
| id | USER_ID | FILE_NAME | FILE_SIZE | FILE_TYPE | added_by     | gallery_id | sub_gallery_id |
+----+---------+-----------+-----------+-----------+--------------+------------+----------------+
|  1 |     456 | /path     |     29832 |         3 | Kim Billings |         35 |              9 |
+----+---------+-----------+-----------+-----------+--------------+------------+----------------+

答案 1 :(得分:1)

虽然OP的问题在确切的水印方法上并不清楚,但我在这里使用GD库显示了文本和图像水印功能。

将文字添加为水印(使用TTF字体): Gist

function add_text_watermark($kep,$Text,$WatermarkNeeded = 1) {
    list($img_type, $Image) = getImage($kep);

$sx = imagesx($Image) ;
$sy = imagesy($Image) ;

if ($WatermarkNeeded)
    { 
    /* Set the font */
    $Font="_arial.ttf";
    $FontColor = ImageColorAllocate ($Image,204,204,204) ;
    $FontShadow = ImageColorAllocate ($Image,100,100,100) ;
    $Rotation = 0 ;
    /* Make a copy image */
    $OriginalImage = ImageCreateTrueColor($sx,$sy) ;
    ImageCopy ($OriginalImage,$Image,0,0,0,0,$sx,$sy) ;

    /* Iterate to get the size up */
    $FontSize=1 ;
    do
        {
        $FontSize *= 1.1 ;
        $Box = @ImageTTFBBox($FontSize,0,$Font,$Text);
        $TextWidth = abs($Box[4] - $Box[0]) ;
        $TextHeight = abs($Box[5] - $Box[1]) ;
        }
    while ($TextWidth < $sx*0.9 && $FontSize < 30) ;
    /*  Awkward maths to get the origin of the text in the right place */
    $x = $sx/2 - cos(deg2rad($Rotation))*$TextWidth/2 ;
    $y = $sy/2 + sin(deg2rad($Rotation))*$TextWidth/2 + cos(deg2rad($Rotation))*$TextHeight/2 ;
    /* Make shadow text first followed by solid text */

    ImageTTFText ($Image,$FontSize,$Rotation,$x+1,$y+1,$FontShadow,$Font,$Text);
    ImageTTFText ($Image,$FontSize,$Rotation,$x,$y,$FontColor,$Font,$Text);

    /* merge original image into version with text to show image through text */
    ImageCopyMerge ($Image,$OriginalImage,0,0,0,0,$sx,$sy,50) ;
    imagejpeg($Image, $kep, 100);
    }
}

function getImage($res) {
    $img = "";
    $type = "";

    if (intval(@imagesx($res)) > 0) {
        $img = $res;
    } else {
        $imginfo = getimagesize($res);

        switch($imginfo[2]) { // Determine type
            case 1:
                $type = "GIF";
                if (function_exists("imagecreatefromgif")) {
                    $img = imagecreatefromgif($res);
                } else {
                    die("Unsupported image type: $type");
                }
                break;
            case 2:
                $type = "JPG";
                if (function_exists("imagecreatefromjpeg")) {
                    $img = imagecreatefromjpeg($res);
                } else {
                    die("Unsupported image type: $type");
                }
                break;
            case 3:
                $type = "PNG";
                if (function_exists("imagecreatefrompng")) {
                    $img = imagecreatefrompng($res);
                } else {
                    die("Unsupported image type: $type");
                }
                break;
        }
    }

    return array($type, $img);
}

编辑:确保您尝试添加为水印文字的ttf字体文件可以看到路径!

将图片添加为水印: Gist

function generate_watermarked_image($originalFileContents, $originalWidth, $originalHeight, $paddingFromBottomRight = 0, $watermarkFileLocation = 'logo.png') {
$watermarkImage = imagecreatefrompng($watermarkFileLocation);
$watermarkWidth = imagesx($watermarkImage);  
$watermarkHeight = imagesy($watermarkImage);

$originalImage = imagecreatefromstring($originalFileContents);

$destX = $originalWidth - $watermarkWidth - $paddingFromBottomRight;  
$destY = $originalHeight - $watermarkHeight - $paddingFromBottomRight;

// creating a cut resource
$cut = imagecreatetruecolor($watermarkWidth, $watermarkHeight);

// copying that section of the background to the cut
imagecopy($cut, $originalImage, 0, 0, $destX, $destY, $watermarkWidth, $watermarkHeight);

// placing the watermark now
imagecopy($cut, $watermarkImage, 0, 0, 0, 0, $watermarkWidth, $watermarkHeight);

// merging both of the images
imagecopymerge($originalImage, $cut, $destX, $destY, 0, 0, $watermarkWidth, $watermarkHeight, 100);

return $originalImage;
}

您可以将其命名为:

$Image = "$desired_dir/".$file_name;

imagejpeg(generate_watermarked_image(file_get_contents($Image), imagesx($Image), imagesy($Image), 10), $Image."-watermarked.jpg", 100);

编辑:确保logo.png或您尝试添加为水印的任何文件都可以看到路径!