简体   繁体   中英

php watermark an image with opacity

i am trying to add a watermark to an image with opacity i have used the answer given here Watermarking an image with php it does roughly what i want but im not sure how to get it to where i want it.

what i want to do is add the image watermark to an image but add opacity to it, i have looked about to see how i would go about it but am unable to work out the code to make it work.

this is what im trying to do. take the watermark and add the image to watermark background as the watermarks background then merge it with the image with opacity. so that they can see the image behide the watermark slightly

code

function Watermark ($image,$output,$overlay,$opacity=20){
    if (!file_exists($image)) {
        die("Image does not exist.");
    }
    // Set offset from bottom-right corner
    $w_offset = 0;
    $h_offset = 100;
    $extension = strtolower(substr($image, strrpos($image, ".") + 1));
    // Load image from file
    switch ($extension){
        case 'jpg':
        $background = imagecreatefromjpeg($image);
        break;
        case 'jpeg':
        $background = imagecreatefromjpeg($image);
        break;
        case 'png':
        $background = imagecreatefrompng($image);
        break;
        case 'gif':
        $background = imagecreatefromgif($image);
        break;
        default:
        die("Image is of unsupported type.");
    }
    // Find base image size
    $swidth = imagesx($background);
    $sheight = imagesy($background);
    // Turn on alpha blending
    imagealphablending($background, true);
    // Create overlay image
    //$overlay = imagecreatefrompng($overlay);
    $photo = imagecreatefromjpeg($image);
    $watermark = imagecreatefrompng($overlay);
    // Get the size of overlay
    $owidth = imagesx($watermark);
    $oheight = imagesy($watermark);
     // This is the key. Without ImageAlphaBlending on, the PNG won't render correctly.
    imagealphablending($photo, true);
    // Copy the watermark onto the master, $offset px from the bottom right corner.
    $offset = 10;
    imagecopy($photo, $watermark, imagesx($photo) - imagesx($watermark) - $offset, imagesy($photo) - imagesy($watermark) - $offset, 0, 0, imagesx($watermark), imagesy($watermark));
            // Output to the browser
    imagejpeg($photo,$output);
    // Overlay watermark
    // Destroy the images
    imagedestroy($background);
    imagedestroy($watermark);
}

there were a few errors in this answer but i managed to correct them, it does what its ment to do but the opacity and position of watermark, can anyone help me out with this please.

this is a function that i have done but doesn't work correctly,

function _Watermark($input, $output, $watermark, $opacity=50){
    $im = $this->imagecreatefrom($input);
    $stamp = $this->imagecreatefrom($watermark);
    // First we create our stamp image manually from GD
    //$stamp = imagecreatetruecolor(100, 70);
    //imagefilledrectangle($stamp, 0, 0, 99, 69, 0x0000FF);
    //imagefilledrectangle($stamp, 9, 9, 90, 60, 0xFFFFFF);
    //imagestring($stamp, 5, 20, 20, 'libGD', 0x0000FF);
    //imagestring($stamp, 3, 20, 40, '(c) 2007-9', 0x0000FF);
    // Set the margins for the stamp and get the height/width of the stamp image
    $marge_right = 10;
    $marge_bottom = 10;
    $ix = imagesx($im);
    $iy = imagesy($im);
    $sx = imagesx($stamp);
    $sy = imagesy($stamp);
    list($iw, $ih, $type, $attr) = getimagesize($input);
    list($sw, $sh, $type, $attr) = getimagesize($watermark);
    //imagecopy($im, $stamp, $ix - $sx - $marge_right, $ix - $sy - $marge_bottom, 0, 0, $sx, $sy);
    // copying relevant section from background to the cut resource 
    $cut = imagecreatetruecolor($sw, $sh);
    echo ($ix - $sx - $marge_right)." x ".($iy - $sy - $marge_bottom)." | $sx x $sy<br/>";
    imagecopy($cut, $im, 0, 0, $ix - $sx - $marge_right,  $iy - $sy - $marge_bottom, $sx, $sy) ;
    // copying relevant section from watermark to the cut resource 
    echo $sx." x ".$sy." | $sw x $sy<br/>";
    imagecopy($cut, $stamp, 0, 0, $sx, $sy, $sw, $sh); 
    // insert cut resource to destination image 
    imagecopymerge($im, $cut, $ix - $sx - $marge_right, $iy - $sy - $marge_right, 0, 0, $sw, $sw, $opacity); 
    //imagecopymerge($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp), $opacity);
    // Save the image to file and free memory
    imagejpeg($im, $output);
    imagedestroy($im);
    imagedestroy($stamp);
    return true;
}
private function imagecreatefrom($input){
    $size = getimagesize($input);
    if($size){
        switch($size['mime']){
            case 'image/jpeg':
                $base =  imagecreatefromjpeg($input);
                imagealphablending( $base, false );
                imagesavealpha( $base, true );
                return $base;
            break;
            case 'image/png':
                $base = imagecreatefrompng($input);
                imagealphablending( $base, false );
                imagesavealpha( $base, true );
                return $base;
            break;
            case 'image/gif':
                $base =  imagecreatefromgif($input);
                imagealphablending( $base, false );
                imagesavealpha( $base, true );
                return $base;
            break;
            case 'image/vnd.wap.wbmp':
                $base =  imagecreatefromwbmp($input);
                    imagealphablending( $base, false );
                imagesavealpha( $base, true );
                return $base;
            break;
            case '': default: return false; break;
        }
    }
    return false;
}

this outputs the image to watermark but does not seam to actually watermark the image.

combination of transparent image use GD library of PHP

<?php 
        //define the width and height of our images
        define("WIDTH", 200);
        define("HEIGHT", 200);

        $dest_image = imagecreatetruecolor(WIDTH, HEIGHT);

        //make sure the transparency information is saved
        imagesavealpha($dest_image, true);

        //create a fully transparent background (127 means fully transparent)
        $trans_background = imagecolorallocatealpha($dest_image, 0, 0, 0, 127);

        //fill the image with a transparent background
        imagefill($dest_image, 0, 0, $trans_background);

        //take create image resources out of the 3 pngs we want to merge into destination image
        $a = imagecreatefrompng('1.png');
        $b = imagecreatefrompng('2.png');
        $c = imagecreatefrompng('3.png');

        //copy each png file on top of the destination (result) png
        imagecopy($dest_image, $a, 0, 0, 0, 0, WIDTH, HEIGHT);
        imagecopy($dest_image, $b, 0, 0, 0, 0, WIDTH, HEIGHT);
        imagecopy($dest_image, $c, 0, 0, 0, 0, WIDTH, HEIGHT);

        //send the appropriate headers and output the image in the browser
        header('Content-Type: image/png');
        imagepng($dest_image);

        //destroy all the image resources to free up memory
        imagedestroy($a);
        imagedestroy($b);
        imagedestroy($c);
        imagedestroy($dest_image);
?>

The new image looks like Transparent background logo (in .png form)

use transparent background logo (in .png form) which produce image something like this. Transparent text image

PHPWatermark library supports image watermarking with setting opacity. For example -

$watermark = new Watermark('/path/to/source.jpg');   
$watermark->setOpacity(.4); 
// Many other options to customize

$watermark->withImage('path/to/logo.png', 'path/to/output.jpg');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM