首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中使用水印显示多幅图像

在PHP中使用水印显示多幅图像
EN

Stack Overflow用户
提问于 2015-02-14 17:17:24
回答 5查看 1.8K关注 0票数 3

我想在多个图像上添加水印,并在浏览器上显示它们。下面是我的一段代码:

代码语言:javascript
复制
<?php
include('admin/connect.php');
$q = mysql_query("select * from ring");
while($row=mysql_fetch_array($q)){  
    $img = 'admin/'.$row['Image'];
    $stamp = imagecreatefrompng('admin/image/watermark.png');
    $im = imagecreatefromjpeg($img);
    $marge_right= 20;
    $marge_bottom = 50;
    $sx = imagesx($stamp);
    $sy = imagesy($stamp);
    imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
    header('Content-type: image/png');
    imagepng($im);
    imagedestroy($im);
}
?>

我在代码中使用了header('Content-type: image/png');,因此无法显示所有图像。在这里,我从数据库中提取图像,然后添加水印,但这将是更好的,如果你们中的任何人可以帮助我添加水印,然后保存在数据库中。提前谢谢。

EN

回答 5

Stack Overflow用户

发布于 2015-02-25 06:52:33

您不能在一个页面中有多个标题作为header('Content-type: image/png') (每个页面只能有一个Content-Type ),但您可以有多个标签。如果您想要修改原始图像,则不需要在数据库中进行更新,在本例中,这是代码。

代码语言:javascript
复制
<?php
include('admin/connect.php');
$q = mysql_query("select * from ring");
while($row=mysql_fetch_array($q)){  
    $img = 'admin/'.$row['Image'];
    $stamp = imagecreatefrompng('admin/image/watermark.png');
    $im = imagecreatefromjpeg($img);
    $marge_right= 20;
    $marge_bottom = 50;
    $sx = imagesx($stamp);
    $sy = imagesy($stamp);
    imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
    imagejpeg($im, 'admin/' . $row['Image']); //This overwrite your original image

    echo "<img src='admin/" . $row['Image'] . "' /><br/>";
    </div>
    }
    ?>

如果你想保留你的原始图像,你必须用另一个名字保存你的图像,然后在数据库中更新这个名字,在这种情况下,你可以这样做:

代码语言:javascript
复制
<?php
include('admin/connect.php');
$q = mysql_query("select * from ring");
while($row=mysql_fetch_array($q)){  
    $img = 'admin/'.$row['Image'];
    $stamp = imagecreatefrompng('admin/image/watermark.png');
    $im = imagecreatefromjpeg($img);
    $marge_right= 20;
    $marge_bottom = 50;
    $sx = imagesx($stamp);
    $sy = imagesy($stamp);
    imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
    imagejpeg($im, 'admin/' . 'wm-' . $row['Image']); //Saving the watermarked with the prefix wm

    echo "<img src='admin/" . 'wm-' . $row['Image'] . "' /><br/>";
    </div>
    }

mysql_query("UPDATE ring SET Image = CONCAT('wm-', Image)"); //Updating all your image with the prefix wm-
    ?>
票数 0
EN

Stack Overflow用户

发布于 2015-03-01 05:23:00

在国际海事组织,您永远不应该(几乎永远不)将图像保存到数据库中。将路径保存到数据库并将其存储在本地或亚马逊S3等云解决方案上

票数 0
EN

Stack Overflow用户

发布于 2015-03-01 15:29:39

您不能在一个请求中发送多个镜像。在我的选项中,您有三个选项。

  1. 将所有图像连接成一个大图像,并使用"css map“(Jquery UI图标以这种方式工作)显示图像。但是对于不同尺寸的单个图像,您会遇到问题,并且连接的图像可能会变得非常大,以此类推。
  2. 您只能通过请求生成一个图像,并使用图像的id来识别图像。但这个解决方案已经提到过了。
  3. 使用base64编码图像,如下所示:

(要获取变量中的图像数据,必须使用输出缓冲)

代码语言:javascript
复制
<?php
include('admin/connect.php');
$q = mysql_query("select * from ring");
while ($row = mysql_fetch_array($q)) {
    $img = 'admin/' . $row['Image'];
    $stamp = imagecreatefrompng('admin/image/watermark.png');
    $im = imagecreatefromjpeg($img);
    $marge_right = 20;
    $marge_bottom = 50;
    $sx = imagesx($stamp);
    $sy = imagesy($stamp);
    imagecopy(
        $im,
        $stamp,
        imagesx($im) - $sx - $marge_right,
        imagesy($im) - $sy - $marge_bottom,
        0,
        0,
        imagesx($stamp),
        imagesy($stamp)
    );
    ob_start();
    imagepng($im);
    $image_data = ob_get_clean();
    echo '<img src="data:image/png;base64,' . base64_encode($image_data) . '">';
   imagedestroy($im);
}

借助一些js的魔力,你可以将html内容包含到你的文件中(比如https://stackoverflow.com/a/9003363/3972213)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28514146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档