@@ -57,6 +57,19 @@ class ImageMagick implements MapperInterface
5757 const SOFTWARE = 'exif:Software ' ;
5858 const XRESOLUTION = 'exif:XResolution ' ;
5959 const YRESOLUTION = 'exif:YResolution ' ;
60+ const TITLE = 'iptc:title ' ;
61+ const KEYWORDS = 'iptc:keywords ' ;
62+ const COPYRIGHT = 'iptc:copyright ' ;
63+ const CAPTION = 'iptc:caption ' ;
64+ const HEADLINE = 'iptc:headline ' ;
65+ const CREDIT = 'iptc:credit ' ;
66+ const SOURCE = 'iptc:source ' ;
67+ const JOBTITLE = 'iptc:jobtitle ' ;
68+ const CITY = 'iptc:city ' ;
69+ const SUBLOCATION = 'iptc:sublocation ' ;
70+ const STATE = 'iptc:state ' ;
71+ const COUNTRY = 'iptc:country ' ;
72+
6073
6174 /**
6275 * Maps the ExifTool fields to the fields of
@@ -91,8 +104,20 @@ class ImageMagick implements MapperInterface
91104 self ::MODEL => Exif::CAMERA ,
92105 self ::ORIENTATION => Exif::ORIENTATION ,
93106 self ::SOFTWARE => Exif::SOFTWARE ,
107+ self ::XRESOLUTION => Exif::HORIZONTAL_RESOLUTION ,
94108 self ::YRESOLUTION => Exif::VERTICAL_RESOLUTION ,
95-
109+ self ::TITLE => Exif::TITLE ,
110+ self ::KEYWORDS => Exif::KEYWORDS ,
111+ self ::COPYRIGHT => Exif::COPYRIGHT ,
112+ self ::CAPTION => Exif::CAPTION ,
113+ self ::HEADLINE => Exif::HEADLINE ,
114+ self ::CREDIT => Exif::CREDIT ,
115+ self ::SOURCE => Exif::SOURCE ,
116+ self ::JOBTITLE => EXIF ::JOB_TITLE ,
117+ self ::CITY => Exif::CITY ,
118+ self ::SUBLOCATION => Exif::SUBLOCATION ,
119+ self ::STATE => Exif::STATE ,
120+ self ::COUNTRY => Exif::COUNTRY
96121
97122 );
98123
@@ -183,6 +208,11 @@ public function mapRawData(array $data) : array
183208 case self ::ISO :
184209 $ value = preg_split ('/([\s,]+)/ ' , $ value )[0 ];
185210 break ;
211+ case self ::XRESOLUTION :
212+ case self ::YRESOLUTION :
213+ $ resolutionParts = explode ('/ ' , $ value );
214+ $ value = (int ) reset ($ resolutionParts );
215+ break ;
186216 case self ::GPSLATITUDE :
187217 $ value = $ this ->extractGPSCoordinates ($ value );
188218 if ($ value === false ) {
@@ -227,6 +257,11 @@ public function mapRawData(array $data) : array
227257 continue 2 ;
228258 }
229259 break ;
260+ case self ::KEYWORDS :
261+ if (!is_array ($ value )) {
262+ $ value = [$ value ];
263+ }
264+ break ;
230265 }
231266 // set end result
232267 $ mappedData [$ key ] = $ value ;
@@ -250,13 +285,13 @@ protected function extractGPSCoordinates(string $coordinates) : float|false
250285 if (is_numeric ($ coordinates ) === true ) {
251286 return ((float ) $ coordinates );
252287 } else {
253- $ m = '!^([0-9]+\/[1-9][0-9]*), ([0-9]+\/[1-9][0-9]*), ([0-9]+\/[1-9][0-9]*)! ' ;
288+ $ m = '!^([0-9]+\/[1-9][0-9]*)(?: , ([0-9]+\/[1-9][0-9]*))?(?: , ([0-9]+\/[1-9][0-9]*))?$ ! ' ;
254289 if (preg_match ($ m , $ coordinates , $ matches ) === 0 ) {
255290 return false ;
256291 }
257292 $ degrees = $ this ->normalizeComponent ($ matches [1 ]);
258- $ minutes = $ this ->normalizeComponent ($ matches [2 ]);
259- $ seconds = $ this ->normalizeComponent ($ matches [3 ]);
293+ $ minutes = $ this ->normalizeComponent ($ matches [2 ] ?? 0 );
294+ $ seconds = $ this ->normalizeComponent ($ matches [3 ] ?? 0 );
260295 if ($ degrees === false || $ minutes === false || $ seconds === false ) {
261296 return false ;
262297 }
0 commit comments