【问题标题】:php watermark an image with opacityphp为不透明度的图像加水印
【发布时间】:2016-11-29 10:53:51
【问题描述】:

我正在尝试将水印添加到不透明的图像中,我使用了此处给出的答案Watermarking an image with php 它大致完成了我想要的操作,但我不确定如何将它放到我想要的位置。

我想要做的是将图像水印添加到图像但添加不透明度, 我已经想知道我将如何去做,但我无法制定出让它工作的代码。

这就是我想要做的。获取水印并将图像添加到水印背景作为水印背景,然后将其与具有不透明度的图像合并。以便他们可以稍微看到水印后面的图像

代码

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

这个答案有一些错误,但我设法纠正了它们,它做了它要做的事情,但水印的不透明度和位置,谁能帮我解决这个问题。

这是我已经完成但无法正常工作的功能,

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;
}

这会将图像输出到水印,但不会接缝以实际为图像添加水印。

【问题讨论】:

    标签: php


    【解决方案1】:

    combination of transparent image使用PHP的GD库

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

    新图像看起来像Transparent background logo (in .png form)

    【讨论】:

    • 这会将多张图像组合在一起,但无法调整单个图像的不透明度。所以这不是回答问题。你能改进你的答案吗?
    • 你需要创建透明的背景标志,这样你就可以看到标志后面的主要图像...这里是创建示例标志的链接..www6.flamingtext.com
    【解决方案2】:

    使用透明背景标志(.png 格式) 产生类似这样的图像。 Transparent text image

    【讨论】:

      【解决方案3】:

      PHPWatermark 库支持设置不透明度的图像水印。例如 -

      $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');
      

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多