Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP watermark image

I am trying to watermark images on upload.

I have a multi upload script in place which works fine, see below:

           $gallery=$_GET["gallery"];
                    $album=$_GET["album"];
if(isset($_FILES['files'])){
    $errors= array();
    foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
        $file_name = $key.$_FILES['files']['name'][$key];
        $file_size =$_FILES['files']['size'][$key];
        $file_tmp =$_FILES['files']['tmp_name'][$key];
        $file_type=$_FILES['files']['type'][$key];  
        if($file_size > 2097152){
            $errors[]='File size must be less than 2 MB';
        }       
        $query="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', '$Fname $Sname', '$gallery', '$album'); ";
        $desired_dir="uploads";
        if(empty($errors)==true){
            if(is_dir($desired_dir)==false){
                mkdir("$desired_dir", 0700);        // Create directory if it does not exist
            }
            if(is_dir("$desired_dir/".$file_name)==false){
                move_uploaded_file($file_tmp,"$desired_dir/".$file_name);
            }else{                                  // rename the file if another one exist
                $new_dir="$desired_dir/".$file_name.time();
                 rename($file_tmp,$new_dir) ;               
            }
         mysql_query($query);           
        }else{
                print_r($errors);
        }
    }
    if(empty($error)){
?>

<script>location.assign("commerce-images.php?state=new");</script>
                                        <?php
    }
}
?>

Is it possible to watermark all images uploaded using my script?

like image 722
Shaun Avatar asked Aug 15 '26 15:08

Shaun


2 Answers

Off topic, but requested, hopefully it helps someone get from mysql_* to PDO out there. PDO Manual Page for bindParam, to point you someplace at least.

Schema

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();
    }
?>

Results

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 |
+----+---------+-----------+-----------+-----------+--------------+------------+----------------+
like image 54
Drew Avatar answered Aug 18 '26 06:08

Drew


While OP's question wasnt crystal clear on the exact method of watermarking, im showing here text and image watermarking capabilities using the GD library.


Adding text as watermark (using TTF font): 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);
}

EDIT: make sure the ttf font file you are trying to add as watermark text are in sight of the path!


Adding Image as watermark: 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;
}

You can call it as:

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

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

EDIT: make sure the logo.png or whatever file you are trying to add as watermark are in sight of the path!

like image 31
kayess Avatar answered Aug 18 '26 05:08

kayess



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!