簡體   English   中英

在PHP中使用水印顯示多個圖像

[英]Display multiple images using watermark in PHP

我想在多個圖像上添加水印並在瀏覽器上顯示它們。 這是我的一段代碼:

<?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'); 在我的代碼中由於我無法顯示所有圖像。 在這里,我從數據庫中提取圖像,然后在其上添加水印,但如果你們中的任何人可以幫助我先添加水印然后將其保存在數據庫中,那將會更好。 提前致謝。

您不能在一個頁面中將多個標題作為header('Content-type: image/png') (每頁只能有一個Content-Type),但您可以使用多個標記。 如果要修改原始映像,則無需在數據庫中進行更新,在這種情況下,這是代碼。

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

如果要保留原始圖像,必須使用其他名稱保存帶有水印的圖像,然后更新數據庫中的名稱,在這種情況下,您可以執行以下操作:

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

IMO,你永遠不應該(幾乎從不)將圖像保存到數據庫中。 將路徑保存到數據庫並將其存儲在本地或存儲在Amazon S3等雲解決方案上

您無法在一個請求中發送多個圖像。 在我的選項中,你有三個選擇。

  1. 將所有圖像連接到一個大圖像,並使用“css map”(以這種方式工作的Jquery UI圖標)顯示圖像。 但是你會遇到單個圖像的不同尺寸的問題,並且連接的圖像可能會變得非常大,等等。

  2. 您只能通過請求生成一個圖像,並使用圖像的ID來標識圖像。 但是已經提到了這個解決方案。

  3. 使用base64編碼圖像,如下所示:

(要在變量中獲取圖像數據,必須使用輸出緩沖)

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

使用Imagick為圖片添加水印。 您可以使用批處理過程定期為存儲在數據庫中的圖像添加水印。 在這種情況下,請使用crontab。

我同意Nihal Sahu的觀點,你不應該(幾乎從不)將圖像保存到數據庫中。 將路徑保存到數據庫並將其存儲在本地。 您處理的時間會更短,就像圖像在數據庫中一樣,時間消耗更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM