iptcembd & keywords

Ok, so I took a look at the snippets etc listed under function.iptcembed on phpnet.

There’s enough there that I can read and write IPTC data correctly, except for one field and I can’t figure out how to properly do it. These are the two functions in question:
[php] function binary() {
echo ‘Setting new binary block for IPTC writing.
’;
$iptc_new = ‘’;
foreach (array_keys($this->meta) as $s) {
$c = count ($this->meta[$s]);
for ($i=0; $i <$c; $i++)
{
$tag = str_replace(“2#”, “”, $s);
$iptc_new .= $this->iptc_maketag(2, $tag, $this->meta[$s][$i]);
}
}
return $iptc_new;
}

    function iptc_maketag($rec,$dat,$val) {
		echo 'Making IPTC Tag<br />';
        $len = strlen($val);
        if ($len < 0x8000) {
               return chr(0x1c).chr($rec).chr($dat).
               chr($len >> 8).
               chr($len & 0xff).
               $val;
        } else {
               return chr(0x1c).chr($rec).chr($dat).
               chr(0x80).chr(0x04).
               chr(($len >> 24) & 0xff).
               chr(($len >> 16) & 0xff).
               chr(($len >> 8 ) & 0xff).
               chr(($len ) & 0xff).
               $val;      
        }
		}
    }    

[/php]

Now, they work fine when I’m inputing data into any of the normal IPTC fields, it however fails when putting data in to the IPTC_KEYWORDS field, and I can assume it’s because that field’s data is an array. I’m getting an “Array to string conversion” notice. I’m not quite a newb, but I’m far from an expert. Below is the entire class file I’m working with:
[php]<?

/*
Examples taken from php.net
*/

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=Array();
    var $hasmeta=false;
    var $file=false;
    
    
    function iptc($filename) {
		echo 'IPTC Loading for: '.$filename.'<br />';
        $size = getimagesize($filename,$info);
        $this->hasmeta = isset($info["APP13"]);
        if($this->hasmeta)
            $this->meta = iptcparse($info["APP13"]);
        $this->file = $filename;
    }
	
    function set($tag, $data) {
		echo 'Updating IPTC Tag.<br />';
        $this->meta ["2#$tag"]= Array( $data );
        $this->hasmeta=true;
    }
	
    function get($tag) {
		echo 'Getting IPTC data.<br />';
        return isset($this->meta["2#$tag"]) ? $this->meta["2#$tag"][0] : false;
    }
	
    function view() {
		echo 'Print IPTC Data.<br />';
			foreach(array_keys($this->meta) as $s) {              
				$c = count ($this->meta[$s]);
				for ($i=0; $i <$c; $i++) 
				{
           			echo $s.' = '.$this->meta[$s][$i].'<br />';
       			}
   			}	                  
	}
	
    function binary() {
		echo 'Setting new binary block for IPTC writing.<br />';
        $iptc_new = '';
        foreach (array_keys($this->meta) as $s) {
		$c = count ($this->meta[$s]);
		for ($i=0; $i <$c; $i++)
		    {
				$tag = str_replace("2#", "", $s);
			    $iptc_new .= $this->iptc_maketag(2, $tag, $this->meta[$s][$i]);
		    }
        }        
        return $iptc_new;   
    }
	
    function iptc_maketag($rec,$dat,$val) {
		echo 'Making IPTC Tag<br />';
        $len = strlen($val);
        if ($len < 0x8000) {
               return chr(0x1c).chr($rec).chr($dat).
               chr($len >> 8).
               chr($len & 0xff).
               $val;
        } else {
               return chr(0x1c).chr($rec).chr($dat).
               chr(0x80).chr(0x04).
               chr(($len >> 24) & 0xff).
               chr(($len >> 16) & 0xff).
               chr(($len >> 8 ) & 0xff).
               chr(($len ) & 0xff).
               $val;      
        }
    }    
    function write() {
		echo 'Writing file...<br />';
        if(!function_exists('iptcembed')) return false;
        $mode = 0;
        $content = iptcembed($this->binary(), $this->file, $mode);    
        $filename = $this->file;
            
        @unlink($filename); #delete if exists
        
        $fp = fopen($filename, "w");
        fwrite($fp, $content);
        fclose($fp);
    }    
    
    #requires GD library installed
    function removeAllTags() {
		'Removing previous IPTC tags to re-write new data.<br />';
        $this->hasmeta=false;
        $this->meta=Array();
        $img = imagecreatefromstring(implode(file($this->file)));
        @unlink($this->file); #delete if exists
        imagejpeg($img,$this->file,100);
    }
};

?>[/php]

And here is the test call that’s being made attempting to write the keywords:
[php]<?php
require_once(“iptceasy.php”);

$i = new iptc(“fortworden.jpg”);
$keywords = array( “keywords” => “updatedkey1”, “updatedkey2”, “updatedkey3” , “updatedkey4” );
echo $i->set(IPTC_KEYWORDS, $keywords);
$i->write();
echo ‘Done.’;
?>[/php]

I’ve been banging my head on this for a while now. Any help?

bump

So I’ve still made no headway with this, anyone able to shed any advice for me?

Sponsor our Newsletter | Privacy Policy | Terms of Service