source: spip-zone/_plugins_/gis/trunk/inc/iptc.php @ 111495

Last change on this file since 111495 was 111495, checked in by bruno@…, 2 months ago

compat PHP 7.2 each => foreach (thx marcimat)

File size: 6.8 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) return;
4
5//#############################################################################################
6//##############################################################################################
7
8/* INFOS SUR LE FICHIER
9
10Nom : iptc.class.php
11Rôle : contient la classe permettant de gérer les IPTC d'un fichier image
12Développeur(s) : Arica Alex, Thies C. Arntzen
13
14FIN INFOS SUR LE FICHIER
15
16
17INFOS SUR LA CLASSE 'class_iptc'
18
19REFERENCES : Développée le 04 Octobre 02 par Arica Alex avec l'aide de Thies C. Arntzen
20
21ROLE : permet de manipuler les iptc d'une image
22
23VARIABLES :
24- $h_codesIptc
25- $h_cheminFichier
26- $h_iptcData
27
28METHODES :
29- fct_lireIPTC
30- fct_ecrireIPTC
31- fct_iptcMaketag
32
33FIN INFOS SUR LA CLASSE
34
35*/
36
37
38class class_IPTC
39{
40
41
42
43/* VARIABLES statics */
44
45var $h_codesIptc; /* $h_codesIptc : (tableau associatif) contient les codes des champs IPTC associés à un libellé */
46var $h_cheminImg; /* $h_cheminImg : (chaine) contient le chemin complet du fichier d'image */
47var $h_iptcData; /* $h_iptcData : (chaine) contient les données encodées de l'iptc de l'image */
48
49/* FIN VARIABLES statics
50
51
52
53
54
55
56
57
58
59-------------------------------------------------------------------------------------------------------
60
61
62
63
64
65
66
67
68INFOS SUR LA FONCTION
69
70ROLE : constructeur
71FONCTION : class_IPTC($cheminImg)
72DESCRIPTION DES PARAMETRES :
73- $cheminImg = (chaine) le chemin complet du fichier d'image à traiter
74
75FIN INFOS SUR LA FONCTION */
76
77
78function __construct($cheminImg)
79{
80
81// Inititalisations
82
83// Les valeurs IPTC pouvant être manipulées
84$this -> h_codesIptc = array("005" => "objectName",
85"007" => "editStatus",
86"010" => "priority",
87"015" => "category",
88"020" => "supplementalCategory",
89"022" => "fixtureIdentifier",
90"025" => "keywords",
91"030" => "releaseDate",
92"035" => "releaseTime",
93"040" => "specialInstructions",
94"045" => "referenceService",
95"047" => "referenceDate",
96"050" => "referenceNumber",
97"055" => "createdDate",
98"060" => "createdTime",
99"065" => "originatingProgram",
100"070" => "programVersion",
101"075" => "objectCycle",
102"080" => "byline",
103"085" => "bylineTitle",
104"090" => "city",
105"095" => "provinceState",
106"100" => "countryCode",
107"101" => "country",
108"103" => "originalTransmissionReference",
109"105" => "headline",
110"110" => "credit",
111"115" => "source",
112"116" => "copyright",
113"120" => "caption",
114"121" => "localCaption",
115"122" => "captionWriter");
116
117
118// On enregistre le chemin de l'image à traiter
119$this -> h_cheminImg = $cheminImg;
120
121
122// On extrait les données encodées de l'iptc
123// getimagesize($this -> h_cheminImg, &$info); //avant,marche pas sinon
124getimagesize($this -> h_cheminImg, $info); //marche sans le &
125$this -> h_iptcData = $info["APP13"];
126
127}
128
129/* FIN FONCTION class_IPTC();
130
131
132
133
134
135
136
137
138
139-------------------------------------------------------------------------------------------------------
140
141
142
143
144
145
146
147
148INFOS SUR LA FONCTION
149
150ROLE : lit les IPTC d'une image et les renvoie dans un tableau associatif
151FONCTION : fct_lireIPTC()
152TYPE RETOURNE : chaine sous forme de tableau associatif
153
154FIN INFOS SUR LA FONCTION */
155
156function fct_lireIPTC()
157{
158        $tblIPTC = iptcparse($this -> h_iptcData);
159
160        if (!is_array($tblIPTC)) { 
161                return false;
162        }
163        foreach ($tblIPTC as $codeIPTC => $valeurIPTC) {
164                $codeIPTC = str_replace("2#", "", $codeIPTC);
165
166                if( ($codeIPTC != "000") && ($codeIPTC != "140")  && $this->h_codesIptc["$codeIPTC"])
167                {
168                        foreach ($valeurIPTC as $index => $v) {
169                                if ($this->h_codesIptc["$codeIPTC"]) $codeIPTC = $this->h_codesIptc["$codeIPTC"];
170                                $lesIptc[$codeIPTC] .= $valeurIPTC[$index].$retourLigne;
171                                $retourLigne = "\n";
172                        }
173                }
174        }
175
176        if(is_array($lesIptc)) return $lesIptc;
177        else return false;
178}
179
180/* FIN FONCTION fct_lireIPTC();
181
182
183
184
185
186
187
188
189-------------------------------------------------------------------------------------------------------
190
191
192
193
194
195
196
197
198INFOS SUR LA FONCTION
199
200ROLE : écrit des IPTC dans le fichier image
201FONCTION : fct_ecrireIPTC()
202DESCRIPTION DES PARAMETRES :
203- $tblIPTC_util = (tableau associatif) contient les codes des champs IPTC à modifier associés leur valeur
204- $cheminImgAModifier = (chaine) stocke le chemin de l'image dont l'IPTC est à modifier ; s'il est null
205le chemin sera celui contenu dans '$this -> h_cheminImg'
206TYPE RETOURNE : booléen
207
208FIN INFOS SUR LA FONCTION */
209
210function fct_ecrireIPTC($tblIPTC_util, $cheminImgAModifier = "")
211{
212
213// La tableau devant contenir des IPTC est vide ou n'est pas un tableau associatif
214if( (empty($tblIPTC_util)) || (!is_array($tblIPTC_util)) ) return false;
215
216
217// Si le chemin de l'image à modifier est vide alors on lui spécifie le chemin par défaut
218if(empty($cheminImgAModifier)) $cheminImgAModifier = $this -> h_cheminImg;
219
220
221// On récupère l'IPTC du fichier image courant
222$tblIPTC_old = iptcparse($this -> h_iptcData);
223
224
225// On prélève le tableau contenant les codes et les valeurs des IPTC de la photo
226foreach ($this -> h_codesIptc as $codeIPTC => $codeLibIPTC) {
227{
228
229// On teste si les données originelles correspondant au code en cours sont présents
230if (is_array($tblIPTC_old["2#".$codeIPTC])) $valIPTC_new = $tblIPTC_old["2#".$codeIPTC];
231else $valIPTC_new = array();
232
233
234// On remplace les valeurs des IPTC demandées
235if (is_array($tblIPTC_util[$codeIPTC]))
236{
237if (count($tblIPTC_util[$codeIPTC])) $valIPTC_new = $tblIPTC_util[$codeIPTC];
238
239}else{
240
241$val = trim(strval($tblIPTC_util[$codeIPTC]));
242if (strlen($val)) $valIPTC_new[0] = $val;
243}
244
245
246// On crée un nouveau iptcData à partir de '$tblIPTC_new' qui contient le code et la valeur de l'IPTC
247foreach($valIPTC_new as $val)
248{
249$iptcData_new .= $this -> fct_iptcMaketag(2, $codeIPTC, $val);
250}
251
252}
253
254
255/* A partir du nouveau iptcData contenu dans '$iptcData_new' on crée grâce à la fonction 'iptcembed()'
256le contenu binaire du fichier image avec le nouveau IPTC inclu */
257$contenuImage = iptcembed($iptcData_new, $this -> h_cheminImg);
258
259
260// Ecriture dans le fichier image
261$idFichier = fopen($cheminImgAModifier, "wb");
262fwrite($idFichier, $contenuImage);
263fclose($idFichier);
264
265
266return true;
267
268}
269
270/* FIN FONCTION fct_ecrireIPTC();
271
272
273
274
275
276
277
278
279-------------------------------------------------------------------------------------------------------
280
281
282
283
284
285
286
287
288INFOS SUR LA FONCTION
289
290ROLE : permet de transformer une valeur de d'IPTC (code + valeur) en iptcData
291AUTEUR : Thies C. Arntzen
292FONCTION : fct_iptcMaketag($rec, $dat, $val)
293DESCRIPTION DES PARAMETRES :
294- $rec = (entier) toujours à mettre à 2
295- $dat = (chaine) le code de l'IPTC (de type '110' et non '2#110')
296- $val = (chaine) la valeur de l'IPTC
297TYPE RETOURNE : booléen
298
299FIN INFOS SUR LA FONCTION */
300
301function fct_iptcMaketag($rec, $dat, $val)
302{
303$len = strlen($val);
304if ($len < 0x8000)
305return chr(0x1c).chr($rec).chr($dat).
306chr($len >> 8).
307chr($len & 0xff).
308$val;
309else
310return chr(0x1c).chr($rec).chr($dat).
311chr(0x80).chr(0x04).
312chr(($len >> 24) & 0xff).
313chr(($len >> 16) & 0xff).
314chr(($len >> 8 ) & 0xff).
315chr(($len ) & 0xff).
316$val;
317}
318
319// FIN FONCTION fct_iptcMaketag();
320
321
322
323
324
325}
326
327/* Fin class_IPTC */
328
329?>
Note: See TracBrowser for help on using the repository browser.