如何使用 PHP 和 GD 制作水印图像,如 envato photodune 预览图像?

Posted

技术标签:

【中文标题】如何使用 PHP 和 GD 制作水印图像,如 envato photodune 预览图像?【英文标题】:How do I to make watermark image with PHP and GD like envato photodune preview image? 【发布时间】:2015-08-14 08:28:57 【问题描述】:

我想用 php 和 GD 库创建水印。

我想在每个重复的徽标之间使用自动边距(空格)重复 水印徽标,以及锯齿形位置。

是否可以创建连接每个水印标志的虚线水印

结果会是这样的:


我已经使用循环函数和奇偶子句完成了之字形。

/*
             * utils
                $widthWatermark = imagesx($logo);
                $heightWatermark = imagesy($logo);
                $widthPhoto = imagesx($output);
                $heightPhoto = imagesy($output);
             */

            // $xLogoPosition = 0;
            // $yLogoPosition = 0;


            $__xRepeat = ceil($widthPhoto / $widthWatermark);
            $__yRepeat = ceil($heightPhoto / $heightWatermark);
            $margin = (int)self::$option['margin'];

            for ($i = 0; $i <= $__xRepeat; $i++) 

                if ($i % 2 === 0)  
                    $pre_ii = 1;
                 else 
                    $pre_ii = 0;
                

                for ($ii = 0; $ii <= $__yRepeat; $ii++) 

                    $ii_zero = $ii - $pre_ii;

                    if ($ii_zero % 2 === 0)        
                        $y_xindent = $widthWatermark;                        
                    else
                        $y_xindent = 0;  
                    

                    $this->imagecopymerge_alpha($output, $logo, ($xLogoPosition + $widthWatermark * $i + $y_xindent), ($yLogoPosition + $widthWatermark * $ii), 0, 0, ImageSX($logo), ImageSY($logo), self::$option['opacity']);
                
            

现在我坚持如何创建具有对角线位置且彼此连接徽标的虚线。

我有来自http://php.net/manual/en/function.imagedashedline.php 的提示 但我不知道如何使用它并将其与我以前生成之字形徽标的代码结合起来

【问题讨论】:

显示你迄今为止的尝试。 【参考方案1】:

编辑

原来 PHP/GD 实际上有一个函数——imagesettile()——专门用来处理这种情况。

我已经修改了我原来的答案来解决这个问题:

<?php
// create php image of a 'dashed cross'.
$crossW = $crossH = 200;
$cross  = imagecreatetruecolor($crossW, $crossH);
imagefill($cross, 0, 0, 0x7fff00ff); // transparent magenta.
imagesetthickness($cross, 1);
imagesetstyle(
    $cross,
    array_merge(
        array_fill(0, 3, 0x7fff00ff), // transparent magenta.
        array_fill(0, 8, 0x60ffffff) // partially-transparent white.
    )
);
imageline($cross, 0, 0, $crossW, $crossH, IMG_COLOR_STYLED);
imageline($cross, $crossW, 0, 0, $crossH, IMG_COLOR_STYLED);

$imageFile = 'wm2.jpg';

// open the image file to be watermarked and store its height and width.
$image = imagecreatefromjpeg($imageFile);
$imWidth = imagesx($image);
$imHeight = imagesy($image);

// apply the cross pattern as a tile to the image file.
imagesettile($image, $cross);
imagefilledrectangle($image, 0, 0, $imWidth, $imHeight, IMG_COLOR_TILED);

header('Content-type: image/png');
imagepng($image);
imagedestroy($cross);
imagedestroy($image);
exit;

输入:

结果:

【讨论】:

@user3681874:Tim 的方法可以解决这个问题 - 只需更改 dash-cross square 的大小,并在必要时修改偏移量。试试看? @user3681874,好的 - see here。

以上是关于如何使用 PHP 和 GD 制作水印图像,如 envato photodune 预览图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中(使用 GD)已经重新采样的图像上叠加水印?

php基础之gd图像生成缩放logo水印和简单验证码实现

PHP使用GD库实现 图像生成缩放logo水印和简单验证码

PHP GD 图像水印质量

php基础 gd图像生成缩放logo水印和验证码

php基础 gd图像生成缩放logo水印和验证码