Можно ли сохранить метаданные в изображении?

Мы создаем изображения большого пальца на нашем сервере, и я ищу способ сохранить метаданные (текст) в этом изображении. Это возможно?

На данный момент мы используем PHP и создаем образы JPG.

Как вы думаете, что люди должны ответить на этот вопрос? Да нет? Расскажите нам о формате файлов.

aku 19.09.2008 18:54

ты прав! обновил мой вопрос

user16094 19.09.2008 19:01

Да. Это не проблема. но ваш вопрос такой же, как этот stackoverflow.com/questions/5384962/writing-exif-data-in-php‌ /….

Riceball LEE 31.12.2011 19:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
3
8 231
5

Ответы 5

EXIF или повторно использовать старую концепцию сокрытия данных, Стенография

Да, это возможно.

Вы можете использовать всемогущую утилиту Exiftool perl, которая обрабатывает почти все известные наборы тегов, как стандартные (EXIF, IPTC, Adobe XMP и т. д.), Так и проприетарные.

Ваш вопрос такой же, как запись данных exif в php.

Мой ответ:

  • PEL (библиотека PHP Exif). Библиотека для чтения и записи заголовков Exif в изображениях JPEG и TIFF с использованием PHP.
  • Набор инструментов метаданных PHP JPEG. Позволяет читать, записывать и отображать следующие форматы метаданных JPEG: EXIF ​​2.2, XMP / RDF, IPTC-NAA IIM 4.1 и т. д.
  • ExifTool от Perl. ExifTool отличный. В нем есть все необходимое - поддержка EXIF, IPTC и XMP (чтение / запись) и поддержка расширений производителя.

Я надеюсь, это поможет вам!

Я изменил класс, который нашел здесь (спасибо дебиторы).

И все ссылки на теги IPTC можно прочитать из этого PDF

Код (PHP> = 5.4):

<?
define("IPTC_OBJECT_NAME", "005");
define("IPTC_EDIT_STATUS", "007");
define("IPTC_PRIORITY", "010");
define("IPTC_CATEGORY", "015");
define("IPTC_SUPPLEMENTAL_CATEGORY", "020");
define("IPTC_FIXTURE_IDENTIFIER", "022");
define("IPTC_KEYWORDS", "025");
define("IPTC_RELEASE_DATE", "030");
define("IPTC_RELEASE_TIME", "035");
define("IPTC_SPECIAL_INSTRUCTIONS", "040");
define("IPTC_REFERENCE_SERVICE", "045");
define("IPTC_REFERENCE_DATE", "047");
define("IPTC_REFERENCE_NUMBER", "050");
define("IPTC_CREATED_DATE", "055");
define("IPTC_CREATED_TIME", "060");
define("IPTC_ORIGINATING_PROGRAM", "065");
define("IPTC_PROGRAM_VERSION", "070");
define("IPTC_OBJECT_CYCLE", "075");
define("IPTC_BYLINE", "080");
define("IPTC_BYLINE_TITLE", "085");
define("IPTC_CITY", "090");
define("IPTC_PROVINCE_STATE", "095");
define("IPTC_COUNTRY_CODE", "100");
define("IPTC_COUNTRY", "101");
define("IPTC_ORIGINAL_TRANSMISSION_REFERENCE", "103");
define("IPTC_HEADLINE", "105");
define("IPTC_CREDIT", "110");
define("IPTC_SOURCE", "115");
define("IPTC_COPYRIGHT_STRING", "116");
define("IPTC_CAPTION", "120");
define("IPTC_LOCAL_CAPTION", "121");

class IPTC
{
    var $meta = [];
    var $file = null;

    function __construct($filename)
    {
        $info = null;

        $size = getimagesize($filename, $info);

        if (isset($info["APP13"])) $this->meta = iptcparse($info["APP13"]);

        $this->file = $filename;
    }

    function getValue($tag)
    {
        return isset($this->meta["2#$tag"]) ? $this->meta["2#$tag"][0] : "";
    }

    function setValue($tag, $data)
    {
        $this->meta["2#$tag"] = [$data];

        $this->write();
    }

    private function write()
    {
        $mode = 0;

        $content = iptcembed($this->binary(), $this->file, $mode);   

        $filename = $this->file;

        if (file_exists($this->file)) unlink($this->file);

        $fp = fopen($this->file, "w");
        fwrite($fp, $content);
        fclose($fp);
    }         

    private function binary()
    {
        $data = "";

        foreach(array_keys($this->meta) as $key)
        {
            $tag = str_replace("2#", "", $key);
            $data .= $this->iptc_maketag(2, $tag, $this->meta[$key][0]);
        }       

        return $data;
    }

    function iptc_maketag($rec, $data, $value)
    {
        $length = strlen($value);
        $retval = chr(0x1C) . chr($rec) . chr($data);

        if ($length < 0x8000)
        {
            $retval .= chr($length >> 8) .  chr($length & 0xFF);
        }
        else
        {
            $retval .= chr(0x80) . 
                       chr(0x04) . 
                       chr(($length >> 24) & 0xFF) . 
                       chr(($length >> 16) & 0xFF) . 
                       chr(($length >> 8) & 0xFF) . 
                       chr($length & 0xFF);
        }

        return $retval . $value;            
    }   

    function dump()
    {
        echo "<pre>";
        print_r($this->meta);
        echo "</pre>";
    }

    #requires GD library installed
    function removeAllTags()
    {
        $this->meta = [];
        $img = imagecreatefromstring(implode(file($this->file)));
        if (file_exists($this->file)) unlink($this->file);
        imagejpeg($img, $this->file, 100);
    }
}

$file = "photo.jpg";
$objIPTC = new IPTC($file);

//set title
$objIPTC->setValue(IPTC_HEADLINE, "A title for this picture");

//set description
$objIPTC->setValue(IPTC_CAPTION, "Some words describing what can be seen in this picture.");

echo $objIPTC->getValue(IPTC_HEADLINE);
?>

Вы должны доверять своему источнику и не утверждать, что это ваш собственный сценарий: php.net/manual/en/function.iptcembed.php#85887

Brian Fegter 06.08.2013 09:22

У меня вопрос, как обновить данные EXIF, например, у меня есть этот тег EXIF: 0x9286 и как его реализовать? Можете ли вы мне помочь?

SenTisso 21.08.2018 21:01

@SenTisso пример кода очень полный. В чем именно твоя проблема?

Matías Cánepa 21.08.2018 21:08

Например, здесь php.net/manual/en/function.iptcembed.php#example-3862 вы обновляете данные IPTC с помощью тегов, например 2#120, который является заголовком и таким же, как в вашем ответе, но мне нужно обновить комментарии в изображении, которое имеет тег EXIF ​​(sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html), а тег - 0x9286, и мой вопрос: как это сделать Добавляю туда или как обновить комментарии.

SenTisso 21.08.2018 21:13

Потому что вы не можете обновить комментарии через IPTC (sno.phy.queensu.ca/~phil/exiftool/TagNames/IPTC.html)

SenTisso 21.08.2018 21:14

Я пробовал это, чтобы определить новый тег, такой как этот define("COMMENTS", "0x9286"), но это дало мне ошибку неправильного форматирования, поэтому я попробовал этот define("COMMENTS", "9286"), и он не вернул никаких ошибок, но ничего не обновил.

SenTisso 21.08.2018 21:16

@SenTisso Обратите внимание, что данные EXIF ​​не могут быть изменены, это данные, установленные устройством. Вы должны придерживаться формата IPTC, и наиболее близким к комментариям будет IPTC_CAPTION.

Matías Cánepa 21.08.2018 21:17

О, я этого не знал, но с помощью exiftool вы можете или даже в проводнике Windows

SenTisso 21.08.2018 21:19

По крайней мере, с PHP это невозможно, по моему опыту. Вот почему я остановился на IPTC

Matías Cánepa 21.08.2018 22:58

Другие вопросы по теме