Skip to content

Commit 457b8f7

Browse files
authored
Merge pull request Frameright#16 from klaari/parse-frameright-metadata
Parse Frameright app generated region metafields
2 parents 323273d + 3752981 commit 457b8f7

File tree

6 files changed

+89
-0
lines changed

6 files changed

+89
-0
lines changed

src/Image.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ public function getIDCMetadata(
117117
'radius' => $region->rbRx,
118118

119119
'vertices' => [],
120+
121+
'regionDefinitionId' => $region->regionDefinitionId,
122+
'regionName' => $region->regionName,
120123
];
121124

122125
if ($region->rbVertices) {
@@ -131,6 +134,8 @@ public function getIDCMetadata(
131134
if ($essentialOnly) {
132135
unset($idc_metadata_region['types']);
133136
unset($idc_metadata_region['roles']);
137+
unset($idc_metadata_region['regionDefinitionId']);
138+
unset($idc_metadata_region['regionName']);
134139

135140
if ($idc_metadata_region['unit'] === 'relative') {
136141
unset($idc_metadata_region['imageWidth']);

src/Metadata/Xmp.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ class Xmp
5252
*/
5353
const PHOTO_MECHANIC_NS = "http://ns.camerabits.com/photomechanic/1.0/";
5454

55+
/**
56+
*
57+
*/
58+
const FRAMERIGHT_IDC_NS = 'http://ns.frameright.io/idc/1.0/';
59+
5560
/**
5661
* @var \DomDocument
5762
*/
@@ -80,6 +85,7 @@ class Xmp
8085
'xmpRights' => self::XMP_RIGHTS_NS,
8186
'Iptc4xmpCore' => self::IPTC4_XMP_CORE_NS,
8287
'Iptc4xmpExt' => self::IPTC4_XMP_EXT_NS,
88+
'FramerightIdc' => self::FRAMERIGHT_IDC_NS,
8389
'photomechanic' => self::PHOTO_MECHANIC_NS
8490
];
8591

src/Metadata/Xmp/ImageRegion.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,21 @@ class ImageRegion
8080
*/
8181
public $rbVertices;
8282

83+
84+
/**
85+
* Region's definition ID from the Frameright service.
86+
*
87+
* @var string|null
88+
*/
89+
public $regionDefinitionId;
90+
91+
/**
92+
* Region's definition name from the Frameright service.
93+
*
94+
* @var string|null
95+
*/
96+
public $regionName;
97+
8398
/**
8499
* Initialize members if a node is provided.
85100
*
@@ -111,6 +126,18 @@ public function __construct($xpath = null, $node = null)
111126
$node
112127
);
113128

129+
$this->regionDefinitionId = self::getNodeValue(
130+
$xpath,
131+
'FramerightIdc:RegionDefinitionId',
132+
$node
133+
);
134+
135+
$this->regionName = self::getNodeValue(
136+
$xpath,
137+
'FramerightIdc:RegionName',
138+
$node
139+
);
140+
114141
$xpathToRb = 'Iptc4xmpExt:RegionBoundary';
115142

116143
foreach ([

tests/Fixtures/frameright.jpg

73.1 KB
Loading

tests/Format/AbstractImageTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ public function testGetIDCMetadata()
7979
$inputRectangleRegion->rbXY = new Point(0.31, 0.18);
8080
$inputRectangleRegion->rbH = 0.385;
8181
$inputRectangleRegion->rbW = 0.127;
82+
$inputRectangleRegion->regionDefinitionId = 'rectangleregiondefid';
83+
$inputRectangleRegion->regionName = 'rectangleregionname';
8284

8385
$inputCircleRegion = new ImageRegion();
8486
$inputCircleRegion->id = 'persltr3';
@@ -97,6 +99,8 @@ public function testGetIDCMetadata()
9799
$inputCircleRegion->rbUnit = 'relative';
98100
$inputCircleRegion->rbXY = new Point(0.59, 0.426);
99101
$inputCircleRegion->rbRx = 0.068;
102+
$inputCircleRegion->regionDefinitionId = 'circleregiondefid';
103+
$inputCircleRegion->regionName = 'circleregionname';
100104

101105
$inputPolygonRegion = new ImageRegion();
102106
$inputPolygonRegion->id = 'persltr1';
@@ -119,6 +123,8 @@ public function testGetIDCMetadata()
119123
new Point(0.148, 0.041),
120124
new Point(0.375, 0.863),
121125
];
126+
$inputPolygonRegion->regionDefinitionId = 'polygonregiondefid';
127+
$inputPolygonRegion->regionName = 'polygonregionname';
122128

123129
$xmp->expects($this->atLeastOnce())->method('getImageRegions')->with(
124130
ShapeFilter::ANY,
@@ -152,6 +158,8 @@ public function testGetIDCMetadata()
152158
'height' => 0.385,
153159
'radius' => null,
154160
'vertices' => [],
161+
'regionDefinitionId' => 'rectangleregiondefid',
162+
'regionName' => 'rectangleregionname',
155163
];
156164

157165
$expectedCircleRegion = [
@@ -177,6 +185,8 @@ public function testGetIDCMetadata()
177185
'height' => null,
178186
'radius' => 0.068,
179187
'vertices' => [],
188+
'regionDefinitionId' => 'circleregiondefid',
189+
'regionName' => 'circleregionname',
180190
];
181191

182192
$expectedPolygonRegion = [
@@ -215,6 +225,8 @@ public function testGetIDCMetadata()
215225
'y' => 0.863,
216226
],
217227
],
228+
'regionDefinitionId' => 'polygonregiondefid',
229+
'regionName' => 'polygonregionname',
218230
];
219231

220232
$this->assertEquals([
@@ -233,6 +245,8 @@ public function testGetIDCMetadata()
233245
unset($expectedRectangleRegion['imageHeight']);
234246
unset($expectedRectangleRegion['radius']);
235247
unset($expectedRectangleRegion['vertices']);
248+
unset($expectedRectangleRegion['regionDefinitionId']);
249+
unset($expectedRectangleRegion['regionName']);
236250

237251
unset($expectedCircleRegion['types']);
238252
unset($expectedCircleRegion['roles']);
@@ -241,6 +255,8 @@ public function testGetIDCMetadata()
241255
unset($expectedCircleRegion['width']);
242256
unset($expectedCircleRegion['height']);
243257
unset($expectedCircleRegion['vertices']);
258+
unset($expectedCircleRegion['regionDefinitionId']);
259+
unset($expectedCircleRegion['regionName']);
244260

245261
unset($expectedPolygonRegion['types']);
246262
unset($expectedPolygonRegion['roles']);
@@ -251,6 +267,8 @@ public function testGetIDCMetadata()
251267
unset($expectedPolygonRegion['width']);
252268
unset($expectedPolygonRegion['height']);
253269
unset($expectedPolygonRegion['radius']);
270+
unset($expectedPolygonRegion['regionDefinitionId']);
271+
unset($expectedPolygonRegion['regionName']);
254272

255273
$this->assertEquals([
256274
$expectedRectangleRegion,

tests/Metadata/XmpTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,39 @@ public function testGetImageRegions()
370370
], $xmp->getImageRegions(ShapeFilter::RECTANGLE, RoleFilter::CROP));
371371
}
372372

373+
/**
374+
* @covers ::getImageRegions
375+
*/
376+
public function testGetImageRegionFromFramerightImage()
377+
{
378+
$jpeg = JPEG::fromFile(
379+
__DIR__ . '/../Fixtures/frameright.jpg');
380+
381+
382+
$xmp = $jpeg->getXmp();
383+
384+
$expectedRegion = new ImageRegion();
385+
$expectedRegion->regionDefinitionId = 'definition-7a54f275-6872-435e-befc-b52d97653a28';
386+
$expectedRegion->regionName = '4:3 Horizontal';
387+
$expectedRegion->id = 'crop-e789b6b8-ee15-45c0-a0c5-3ad38858db14';
388+
$expectedRegion->names = null;
389+
$expectedRegion->types = null;
390+
$expectedRegion->roles = [
391+
'http://cv.iptc.org/newscodes/imageregionrole/cropping',
392+
];
393+
$expectedRegion->rbShape = 'rectangle';
394+
$expectedRegion->rbUnit = 'relative';
395+
$expectedRegion->rbXY = new Point(0.0375, 0);
396+
$expectedRegion->rbRx = null;
397+
$expectedRegion->rbH = '1';
398+
$expectedRegion->rbW = '0.8890625';
399+
400+
$this->assertEquals([
401+
$expectedRegion,
402+
], $xmp->getImageRegions());
403+
404+
}
405+
373406
/**
374407
* @param Xmp $xmp
375408
*/

0 commit comments

Comments
 (0)