PHP syntax for iptcembed(): I can't seem to properly take care of "int $spool = 0): string|bool"

83 Views Asked by At

What is the proper syntax for that function?

iptcembed('Cincinnati','https://www.stev.com/TMuploads/Hebe%20-%202022%202023%200107%201859%2010.jpg',['2#120'][0]);

I've manually inserted %20 for each space. I expected it to insert "Cincinnati" in a JPG file's IPTC metadata.

1

There are 1 best solutions below

1
On

The definition of iptcembed() is:

iptcembed(string $iptc_data, string $filename, int $spool = 0): string|bool

The third argument ($spool) is just a flag - an integer: if the value is less than 2, then the function will return a string. Otherwise (f.e. if it is equal to or higher than 2) then the JPEG data will be "printed" to STDOUT. The documentation for that argument reads:

Spool flag. If the spool flag is less than 2 then the JPEG will be returned as a string. Otherwise the JPEG will be printed to STDOUT.

And the documentation on the function's return value mentions that you always have to expect the Boolean datatype when something goes wrong and a string can't be returned:

If spool is less than 2, the JPEG will be returned, or false on failure. Otherwise returns true on success or false on failure.

Making the iptc_data object is a bit tricky, so it's probably best to just use the sample code from the documentation of that function, particularly the iptc_make_tag() function given there:

<?php

// iptc_make_tag() function by Thies C. Arntzen
function iptc_make_tag($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;
}

// Path to jpeg file
$path = './phplogo.jpg';

// Set the IPTC tags
$iptc = array(
    '2#120' => 'Test image',
    '2#116' => 'Copyright 2008-2009, The PHP Group'
);

// Convert the IPTC tags into binary code
$data = '';

foreach($iptc as $tag => $string)
{
    $tag = substr($tag, 2);
    $data .= iptc_make_tag(2, $tag, $string);
}

// Embed the IPTC data
$content = iptcembed($data, $path);

// Write the new image data out to the file.
$fp = fopen($path, "wb");
fwrite($fp, $content);
fclose($fp);
?>