@zubrrap
Новичок

Как сделать чтоб водяной знак не адаптировался?

Столкнулся с проблемой.
На сайте производится загрузка изображения.
Далее устанавливается водяной знак.

Header("Content-type: image/jpg"); //указываем на тип передаваемых данных
	putenv('GDFONTPATH=' . realpath('.')); $font_file = "arial";
	$img="../profile/photo/".$name.$format;//изображение
	$pic = imagecreatefromjpeg($img); //открываем рисунок в формате JPEG
	$color=imagecolorallocate($pic, 191, 191, 191); //получаем идентификатор цвета
	/* определяем место размещения текста по вертикали и горизонтали */
	$h =  imagesy($pic); //высота
	$w = imagesx($pic)/2;//ширина
	/* выводим текст на изображение */
	imagettftext($pic, 25, 35, $w, $h, $color, $font_file, "текст текст текст ");
	imagejpeg($pic,"../profile/photo/".$name.$format); //сохраняем рисунок в формате JPEG в каталог
	imagedestroy($pic); //освобождаем память и закрываем изображение


Только вот текст становится больше или меньше в зависимости от размера изображения, чем больше изображение , тем меньше размером текст.
Как сделать чтоб текст был определённого размера не смотря на размер изображения?
  • Вопрос задан
  • 233 просмотра
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
https://php.ru/manual/function.imagettftext.html
Задайте размер шрифта надписи относительно ширине исходного изображения.
Ответ написан
glaphire
@glaphire Куратор тега PHP
PHP developer
Александр Захаров, решение проблемы размещения водяного знака в нижнем правом углу.
Я отрефакторила код для повышения читаемости :) советую в будущем уделить внимание стандартам PSR и именованию переменных.
Нужно использовать функцию imagettfbbox, чтобы получить координаты рамки текста, а из нее уже посчитать ширину и высоту. Отнимая ширину текста от ширины картинки, получим координату X, по которой вставляем текст.
Код решения

<?php

Header("Content-type: image/jpg");

const CURRENT_DIR = '/absolute/path/to/dir';

$font_file = CURRENT_DIR . '/arial.ttf';
$format = 'jpeg';
$file_name_original = 'original_file';
$file_name_processed = 'new_file';
$font_size_pt = 25;
$angle = 35;
$watermark_text = "текст текст текст";

$image_original = CURRENT_DIR . '/' . $file_name_original . '.' . $format;
$image_processed = CURRENT_DIR . '/' . $file_name_processed . '.' . $format;

$pic = imagecreatefromjpeg($image_original);
$color = imagecolorallocate($pic, 191, 191, 191);

$image_height = imagesy($pic);
$image_width = imagesx($pic);

$box = imagettfbbox ($font_size_pt, $angle, $font_file, $watermark_text);

if (empty($box)) {
    throw new \Exception("Couldn't calculate watermark text boundaries");
}

// source: https://www.php.net/manual/en/function.imagettfbbox.php#97357
$min_x = min( array($box[0], $box[2], $box[4], $box[6]) );
$max_x = max( array($box[0], $box[2], $box[4], $box[6]) );
$text_width  = ( $max_x - $min_x );

$x = $image_width - $text_width;

imagettftext($pic, $font_size_pt, $angle, $x, $image_height, $color, $font_file, $watermark_text);
imagejpeg($pic, $image_processed);
imagedestroy($pic);



Пример на моей картинке:
Картинка со знаком

5da22f1037e6d075939628.jpeg
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы