Присвоение заголовка рисункам: атрибут тега img и метаданные в PHP

Раздел: Работа с медиа -> Обработка изображений

Заголовок изображения может использоваться в двух контекстах: как HTML атрибут title тега img для всплывающей подсказки, и как метаданные самого файла (например, IPTC поле Object Name). В PHP доступны различные способы работы с этими заголовками.

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

Наиболее эффективный способ для веб-страниц - генерация HTML тега img с атрибутом title непосредственно в PHP. Это прямое и простое решение, не требующее дополнительных библиотек.


function imgWithTitle(string $src, string $title): string {
    $escapedSrc = htmlspecialchars($src, ENT_QUOTES, 'UTF-8');
    $escapedTitle = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
    return '<img src="' . $escapedSrc . '" title="' . $escapedTitle . '" alt="" />';
}
echo imgWithTitle('photo.jpg', 'Красивый пейзаж');

Title img php (заголовок изображения в php)

<img src="photo.jpg" title="Красивый пейзаж" alt="" />

Php img alt (вывод атрибута alt изображения в php)

Данная функция экранирует значения для защиты от XSS. В качестве alt рекомендуется также указывать описание.

Как задать title для изображения, используя данные из базы?

Если заголовки хранятся в базе данных, можно извлечь их и передать в функцию. Пример с PDO:


$stmt = $pdo->query("SELECT filename, title FROM images WHERE id = 1");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo imgWithTitle($row['filename'], $row['title']);

Php png (создание png изображений с помощью gd в php)

Здесь предполагается, что функция imgWithTitle определена ранее.

Типичная ошибка: отсутствие экранирования при выводе данных из БД. Если данные не экранировать, возможно внедрение вредоносного кода. Решение - использовать htmlspecialchars, как показано выше.

Как автоматически создать заголовок изображения на основе его имени?

Можно преобразовать имя файла в читаемый заголовок, убрав расширение и заменив подчеркивания на пробелы.


function titleFromFilename(string $filename): string {
    $name = pathinfo($filename, PATHINFO_FILENAME);
    $name = str_replace(['_', '-'], ' ', $name);
    return mb_convert_case($name, MB_CASE_TITLE, 'UTF-8');
}
echo imgWithTitle('sunset_beach.jpg', titleFromFilename('sunset_beach.jpg'));

Php image (работа с изображениями php)

<img src="sunset_beach.jpg" title="Sunset Beach" alt="" />

Images php (изображения в php)

Проблема: имена файлов могут содержать цифры или специальные символы. Следует доработать обработку под конкретные требования. Также поддержка многобайтовых кодировок через mb_convert_case.

Как получить заголовок, хранящийся в самом файле изображения (IPTC)?

Многие изображения содержат IPTC метаданные, в том числе поле "Object Name" (2#005) которое используется как заголовок. Функция getimagesize позволяет получить блок APP13.


function getIptcTitle(string $imagePath): ?string {
    $size = getimagesize($imagePath, $info);
    if (isset($info['APP13'])) {
        $iptc = iptcparse($info['APP13']);
        if (isset($iptc['2#005'][0])) {
            return $iptc['2#005'][0];
        }
    }
    return null;
}
$title = getIptcTitle('image.jpg');
if ($title) {
    echo imgWithTitle('image.jpg', $title);
} else {
    echo 'Заголовок не найден';
}

Color php (работа с цветами в php)

Ошибки: изображение может не содержать IPTC данных. Функция вернет null. Также getimagesize может не сработать для некоторых форматов. Решение - проверять результат и обрабатывать исключения.

Как изменить заголовок изображения внутри файла средствами PHP?

Для записи IPTC заголовка используется функция iptcembed. Необходимо создать корректный IPTC блок с нужными тегами. Работает только для JPEG.


function setIptcTitle(string $imagePath, string $newTitle): bool {
    // Читаем исходное изображение
    $content = file_get_contents($imagePath);
    if ($content === false) return false;
    // Создаем IPTC данные
    $iptcData = '';
    $iptcData .= iptcembed("\x1C\x02\x05\x00" . chr(strlen($newTitle)) . $newTitle, $content, 0);
    // Сохраняем
    return file_put_contents($imagePath, $iptcData) !== false;
}
setIptcTitle('photo.jpg', 'Новый заголовок');

Pictures php (работа с изображениями в php)

Данный пример устаревший и может не работать в современных версиях PHP. Рекомендуется использовать библиотеки Imagick или GD с поддержкой метаданных.

Частые проблемы: функция iptcembed может искажать изображение или терять другие IPTC данные. Кроме того, поддерживается только формат JPEG. Решение - применять Imagick, который более гибок.

Как прочитать или изменить заголовок через библиотеку Imagick?

Imagick предоставляет удобные методы для работы с метаданными. Чтение заголовка (XMP:Title):


$image = new Imagick('image.jpg');
$title = $image->getImageProperty('XMP:Title');
echo $title ?: 'Заголовок не установлен';

Установка заголовка:


$image = new Imagick('image.jpg');
$image->setImageProperty('XMP:Title', 'Мой заголовок');
$image->writeImage('image.jpg');

Проблемы: не все изображения содержат XMP метаданные; библиотека Imagick должна быть установлена. Также возможно изменение не только заголовка, но и других свойств.

Расширенные примеры работы с заголовками изображений

Ниже приведены примеры, демонстрирующие различные сценарии использования.

Пример 1: Функция для генерации img с title из массива параметров

Пример

function renderImage(array $params): string {
    $src = htmlspecialchars($params['src'] ?? '');
    $title = htmlspecialchars($params['title'] ?? '');
    $alt = htmlspecialchars($params['alt'] ?? $title);
    $class = htmlspecialchars($params['class'] ?? '');
    $html = '<img src="' . $src . '" title="' . $title . '" alt="' . $alt . '"';
    if ($class) $html .= ' class="' . $class . '"';
    $html .= ' />';
    return $html;
}
echo renderImage(['src'=>'photo.jpg', 'title'=>'Отпуск 2024', 'alt'=>'Пляж', 'class'=>'photo']);
<img src="photo.jpg" title="Отпуск 2024" alt="Пляж" class="photo" />

Пример 2: Чтение заголовка из EXIF поля ImageDescription

Пример

function getExifDescription(string $path): ?string {
    $exif = @exif_read_data($path, 'IFD0', true);
    if ($exif && isset($exif['IFD0']['ImageDescription'])) {
        return $exif['IFD0']['ImageDescription'];
    }
    return null;
}
$desc = getExifDescription('image.jpg');
echo $desc ?: 'Нет описания';
Закат на море

Обратите внимание: EXIF поле ImageDescription часто используется для подписи к изображению, его можно применять как заголовок.

Пример 3: Массовая установка заголовка через Imagick

Пример

$files = glob('photos/*.jpg');
foreach ($files as $file) {
    $img = new Imagick($file);
    $baseName = pathinfo($file, PATHINFO_FILENAME);
    $title = str_replace('_', ' ', $baseName);
    $img->setImageProperty('XMP:Title', $title);
    $img->writeImage($file);
    echo "Updated: $file - $title\n";
}
Updated: photos/photo1.jpg - photo1
Updated: photos/sunset_beach.jpg - sunset beach

Этот скрипт проходит по всем JPEG в папке и устанавливает заголовок на основе имени файла.

Пример 4: Обработка ошибок при iptcembed

Пример

function setIptcTitleSafe(string $path, string $title): bool {
    if (!file_exists($path) || !is_writable($path)) {
        return false;
    }
    $mime = mime_content_type($path);
    if ($mime !== 'image/jpeg') {
        return false; // только JPEG
    }
    $content = file_get_contents($path);
    if ($content === false) return false;
    // Проверяем наличие IPTC вставки
    $newContent = iptcembed("\x1C\x02\x05\x00" . chr(strlen($title)) . $title, $content, 0);
    if ($newContent === false) return false;
    return file_put_contents($path, $newContent) !== false;
}
if (setIptcTitleSafe('test.jpg', 'Заголовок тест')) {
    echo 'Успешно';
} else {
    echo 'Ошибка';
}
Успешно

Пример 5: Использование библиотеки Intervention Image (альтернатива)

Пример

// Требуется composer require intervention/image
use Intervention\Image\ImageManager;
$manager = new ImageManager(['driver' => 'imagick']);
$image = $manager->make('photo.jpg');
$image->setTitle('Заголовок через Intervention');
$image->save('photo.jpg');
(файл обновлен)

Intervention Image предоставляет высокоуровневый интерфейс для работы с изображениями, включая метаданные. Метод setTitle устанавливает атрибут title для XMP, если драйвер поддерживает.

Заголовок изображения в PHP - comments

En
Title img php (php)