[英]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等雲解決方案上
您無法在一個請求中發送多個圖像。 在我的選項中,你有三個選擇。
將所有圖像連接到一個大圖像,並使用“css map”(以這種方式工作的Jquery UI圖標)顯示圖像。 但是你會遇到單個圖像的不同尺寸的問題,並且連接的圖像可能會變得非常大,等等。
您只能通過請求生成一個圖像,並使用圖像的ID來標識圖像。 但是已經提到了這個解決方案。
使用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 )
我同意Nihal Sahu的觀點,你不應該(幾乎從不)將圖像保存到數據庫中。 將路徑保存到數據庫並將其存儲在本地。 您處理的時間會更短,就像圖像在數據庫中一樣,時間消耗更多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.