Отображение нескольких изображений с использованием водяного знака в переполнении стека

Я хочу добавить водяной знак на несколько изображений и отобразить их в браузере. Вот мой кусок кода:

<?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'); в моем коде, из-за которого я не могу отобразить все изображения.
Здесь я выбираю изображения из базы данных, а затем добавляю водяные знаки, но будет лучше, если кто-нибудь из вас поможет мне сначала добавить водяные знаки, а затем сохранить их в базе данных.
Заранее спасибо.

2

Решение

Вы не можете иметь несколько заголовков как 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-
?>
0

Другие решения

ИМО, вы никогда не должны (почти никогда) сохранять изображения в базе данных. Сохраните пути к базе данных и сохраните их локально или в облачном решении, таком как Amazon S3

0

Вы не можете отправить несколько изображений в одном запросе. В моем варианте у вас есть три варианта.

  1. Объедините все изображения в одно большое изображение и отобразите изображения с помощью «карты css» (таким образом работают значки пользовательского интерфейса Jquery). Но у вас будут проблемы с разными размерами отдельных изображений, и объединенное изображение может стать очень большим и так далее.

  2. Вы генерируете только одно изображение по запросу и используете его идентификатор для идентификации изображения. Но это решение уже упоминалось.

  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 magic вы можете включить html-контент в свой файл (например, https://stackoverflow.com/a/9003363/3972213)

0

Использовать Imagick для водяных знаков на картинке. Вы можете использовать пакетный процесс для нанесения водяных знаков на изображения, которые вы регулярно сохраняете в базе данных. В этом случае используйте crontab.

0

Я согласен с Нихалом Саху, что вы никогда не должны (почти никогда) сохранять изображения в базе данных. Сохраните пути к базе данных и сохраните их локально. Это займет меньше времени для обработки, как будто изображения находятся в базе данных, тогда больше времени.

0
По вопросам рекламы [email protected]