You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gis/inc/iptc.php

336 lines
6.9 KiB
PHP

<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
//#############################################################################################
//##############################################################################################
/* INFOS SUR LE FICHIER
Nom : iptc.class.php
Rôle : contient la classe permettant de gérer les IPTC d'un fichier image
Développeur(s) : Arica Alex, Thies C. Arntzen
FIN INFOS SUR LE FICHIER
INFOS SUR LA CLASSE 'class_iptc'
REFERENCES : Développée le 04 Octobre 02 par Arica Alex avec l'aide de Thies C. Arntzen
ROLE : permet de manipuler les iptc d'une image
VARIABLES :
- $h_codesIptc
- $h_cheminFichier
- $h_iptcData
METHODES :
- fct_lireIPTC
- fct_ecrireIPTC
- fct_iptcMaketag
FIN INFOS SUR LA CLASSE
*/
class class_IPTC
{
/* VARIABLES statics */
public $h_codesIptc; /* $h_codesIptc : (tableau associatif) contient les codes des champs IPTC associés à un libellé */
public $h_cheminImg; /* $h_cheminImg : (chaine) contient le chemin complet du fichier d'image */
public $h_iptcData; /* $h_iptcData : (chaine) contient les données encodées de l'iptc de l'image */
/* FIN VARIABLES statics
-------------------------------------------------------------------------------------------------------
INFOS SUR LA FONCTION
ROLE : constructeur
FONCTION : class_IPTC($cheminImg)
DESCRIPTION DES PARAMETRES :
- $cheminImg = (chaine) le chemin complet du fichier d'image à traiter
FIN INFOS SUR LA FONCTION */
function __construct($cheminImg)
{
// Inititalisations
// Les valeurs IPTC pouvant être manipulées
$this -> h_codesIptc = [
"005" => "objectName",
"007" => "editStatus",
"010" => "priority",
"015" => "category",
"020" => "supplementalCategory",
"022" => "fixtureIdentifier",
"025" => "keywords",
"030" => "releaseDate",
"035" => "releaseTime",
"040" => "specialInstructions",
"045" => "referenceService",
"047" => "referenceDate",
"050" => "referenceNumber",
"055" => "createdDate",
"060" => "createdTime",
"065" => "originatingProgram",
"070" => "programVersion",
"075" => "objectCycle",
"080" => "byline",
"085" => "bylineTitle",
"090" => "city",
"095" => "provinceState",
"100" => "countryCode",
"101" => "country",
"103" => "originalTransmissionReference",
"105" => "headline",
"110" => "credit",
"115" => "source",
"116" => "copyright",
"120" => "caption",
"121" => "localCaption",
"122" => "captionWriter"
];
// On enregistre le chemin de l'image à traiter
$this -> h_cheminImg = $cheminImg;
// On extrait les données encodées de l'iptc
// getimagesize($this -> h_cheminImg, &$info); //avant,marche pas sinon
getimagesize($this -> h_cheminImg, $info); //marche sans le &
if (!isset($info["APP13"])) {
$info["APP13"] = '';
}
$this -> h_iptcData = $info["APP13"];
}
/* FIN FONCTION class_IPTC();
-------------------------------------------------------------------------------------------------------
INFOS SUR LA FONCTION
ROLE : lit les IPTC d'une image et les renvoie dans un tableau associatif
FONCTION : fct_lireIPTC()
TYPE RETOURNE : chaine sous forme de tableau associatif
FIN INFOS SUR LA FONCTION */
function fct_lireIPTC()
{
$tblIPTC = iptcparse($this -> h_iptcData);
if (!is_array($tblIPTC)) {
return false;
}
foreach ($tblIPTC as $codeIPTC => $valeurIPTC) {
$codeIPTC = str_replace("2#", "", $codeIPTC);
if( ($codeIPTC != "000") && ($codeIPTC != "140") && in_array($codeIPTC, $this->h_codesIptc))
{
foreach ($valeurIPTC as $index => $v) {
if ($this->h_codesIptc["$codeIPTC"]) $codeIPTC = $this->h_codesIptc["$codeIPTC"];
$lesIptc[$codeIPTC] .= $valeurIPTC[$index].$retourLigne;
$retourLigne = "\n";
}
}
}
if(isset($lesIptc) && is_array($lesIptc)) return $lesIptc;
else return false;
}
/* FIN FONCTION fct_lireIPTC();
-------------------------------------------------------------------------------------------------------
INFOS SUR LA FONCTION
ROLE : écrit des IPTC dans le fichier image
FONCTION : fct_ecrireIPTC()
DESCRIPTION DES PARAMETRES :
- $tblIPTC_util = (tableau associatif) contient les codes des champs IPTC à modifier associés leur valeur
- $cheminImgAModifier = (chaine) stocke le chemin de l'image dont l'IPTC est à modifier ; s'il est null
le chemin sera celui contenu dans '$this -> h_cheminImg'
TYPE RETOURNE : booléen
FIN INFOS SUR LA FONCTION */
function fct_ecrireIPTC($tblIPTC_util, $cheminImgAModifier = "")
{
$iptcData_new = null;
// La tableau devant contenir des IPTC est vide ou n'est pas un tableau associatif
if( (empty($tblIPTC_util)) || (!is_array($tblIPTC_util)) ) return false;
// Si le chemin de l'image à modifier est vide alors on lui spécifie le chemin par défaut
if(empty($cheminImgAModifier)) $cheminImgAModifier = $this -> h_cheminImg;
// On récupère l'IPTC du fichier image courant
$tblIPTC_old = iptcparse($this -> h_iptcData);
// On prélève le tableau contenant les codes et les valeurs des IPTC de la photo
foreach ($this -> h_codesIptc as $codeIPTC => $codeLibIPTC)
{
// On teste si les données originelles correspondant au code en cours sont présents
if (is_array($tblIPTC_old["2#".$codeIPTC])) $valIPTC_new = $tblIPTC_old["2#".$codeIPTC];
else $valIPTC_new = [];
// On remplace les valeurs des IPTC demandées
if (is_array($tblIPTC_util[$codeIPTC]))
{
if (count($tblIPTC_util[$codeIPTC])) $valIPTC_new = $tblIPTC_util[$codeIPTC];
}else{
$val = trim(strval($tblIPTC_util[$codeIPTC]));
if (strlen($val)) $valIPTC_new[0] = $val;
}
// On crée un nouveau iptcData à partir de '$tblIPTC_new' qui contient le code et la valeur de l'IPTC
foreach($valIPTC_new as $val)
{
$iptcData_new .= $this -> fct_iptcMaketag(2, $codeIPTC, $val);
}
}
/* A partir du nouveau iptcData contenu dans '$iptcData_new' on crée grâce à la fonction 'iptcembed()'
le contenu binaire du fichier image avec le nouveau IPTC inclu */
$contenuImage = iptcembed($iptcData_new, $this -> h_cheminImg);
// Ecriture dans le fichier image
$idFichier = fopen($cheminImgAModifier, "wb");
fwrite($idFichier, $contenuImage);
fclose($idFichier);
return true;
}
/* FIN FONCTION fct_ecrireIPTC();
-------------------------------------------------------------------------------------------------------
INFOS SUR LA FONCTION
ROLE : permet de transformer une valeur de d'IPTC (code + valeur) en iptcData
AUTEUR : Thies C. Arntzen
FONCTION : fct_iptcMaketag($rec, $dat, $val)
DESCRIPTION DES PARAMETRES :
- $rec = (entier) toujours à mettre à 2
- $dat = (chaine) le code de l'IPTC (de type '110' et non '2#110')
- $val = (chaine) la valeur de l'IPTC
TYPE RETOURNE : booléen
FIN INFOS SUR LA FONCTION */
function fct_iptcMaketag($rec, $dat, $val)
{
$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;
}
// FIN FONCTION fct_iptcMaketag();
}
/* Fin class_IPTC */
?>