Skip to content
PHP image metadata library (XMP, IPTC, Exif)
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Image metadata library (PHP 5.5+)

Build Status Dependency Status

Latest Stable Version Total Downloads Latest Unstable Version License

Warning: This library is pre-alpha and much of it is a WIP or simply not working at all. Proceed at your own risk.

Supported image types:

  • JPEG
  • PNG
  • GIF
  • PDF
  • SVG
  • WEBP
  • TIFF
  • DNG
  • RAW FORMATS - CR2, NEF, etc.

Supported image meta types:

  • XMP
  • IPTC
  • EXIF

Get metadata

$image = Image::fromFile($filename);

$headline = $image->getXmp()->getHeadline();
$camera = $image->getExif()->getCamera();

Modify existing metadata

$image = Image::fromFile($filename);

$xmp = $image->getXmp();
$xmp->setHeadline('A test headline');



Standalone XMP

Generating standalone XMP

$xmp = new Xmp;
$xmp->setHeadline('A headline')

$data = $xmp->getXml();

Modifying standalone XMP

$xmp = new Xmp($data); // or Xmp::fromFile($filename)
$xmp->setHeadline('A headline');

$data = $xmp->getXml();

Setting/replacing XMP in image

$xmp = new Xmp;
$xmp->setHeadline('A headline');

$image = Image::fromFile($filename);

$image->save() // or $image->getBytes()

Loading specific image type

When file type is known, you can load the file type directly using the file types' fromFile method.

$jpeg = JPEG::fromFile('image.jpg');
$png = PNG::fromFile('image.png');

Instantiate from bytes

If you don't have a file to work with but you do have the image stored in a string (from database, ImageMagick etc.) you can easily instantiate an object from the string.

$data = ...

$jpeg = JPEG::fromString($data);
$jpeg->getXmp()->setHeadline('Test headline');

$jpeg->save('out.jpg'); // or $jpeg->getBytes();

Instantiate from GD or a stream

You can also create an object from a GD resource or a stream.

$gd = imagecreate(100, 100);
$jpeg = JPEG::fromResource($gd);
$stream = fopen('...', 'r+');
$jpeg = JPEG::fromStream($stream);

Aggregate metadata

When just want a piece of metadata and don't care whether it's from XMP, IPTC or EXIF, you can use the aggregate meta object.

$image = Image::fromFile($filename);
$headline = $image->getAggregate()->getHeadline();

By default it checks XMP first, then IPTC, then EXIF but you can change the priority:

$aggregate = $image->getAggregate();
$aggregate->setPriority(['exif', 'iptc', 'xmp']);

$aggregate->getHeadline(); // will now check EXIF first, then IPTC, then XMP

You can also exclude a metadata type if you do not want to use it:

$aggregate->setPriority(['iptc', 'xmp']);
$aggregate->getHeadline(); // will only check IPTC and XMP

You can also modify metadata on an aggregate level:

$image = Image::fromFile($filename);


This would set the headline in both XMP and IPTC. For maximum compatibility with other software it's recommended to use the aggregate metadata object where available.

Get GPS data

$image = ...
$gps = $image->getAggregateMeta()->getGPS(); // checks EXIF and XMP
// or $gps = $image->getExif()->getGPS();

$lat = $gps->getLatitude();
You can’t perform that action at this time.