You've already forked pigallery2
							
							
				mirror of
				https://github.com/bpatrik/pigallery2.git
				synced 2025-10-30 23:57:43 +02:00 
			
		
		
		
	Adding test to exiftool based face region parsing
This commit is contained in:
		| @@ -210,45 +210,52 @@ export class MetadataLoader { | ||||
|                 const faces: FaceRegion[] = []; | ||||
|                 if (ret.Regions && ret.Regions.value.RegionList && ret.Regions.value.RegionList.value) { | ||||
|                   for (let i = 0; i < ret.Regions.value.RegionList.value.length; i++) { | ||||
|                     if (ret.Regions.value.RegionList.value[i].value && | ||||
|                         ret.Regions.value.RegionList.value[i].value['rdf:Description'] && | ||||
|                         ret.Regions.value.RegionList.value[i].value['rdf:Description'].value && | ||||
|                         ret.Regions.value.RegionList.value[i].value['rdf:Description'].value['mwg-rs:Area']) { | ||||
|                       const region = ret.Regions.value.RegionList.value[i].value['rdf:Description']; | ||||
|                       const regionBox = ret.Regions.value.RegionList.value[i].value['rdf:Description'].value['mwg-rs:Area'].attributes; | ||||
|                       if (region.attributes['mwg-rs:Type'] !== 'Face' || | ||||
|                         !region.attributes['mwg-rs:Name']) { | ||||
|                         continue; | ||||
|                       } | ||||
|                       const name = region.attributes['mwg-rs:Name']; | ||||
|                       const box = { | ||||
|                         width: Math.round(parseFloat('' + regionBox['stArea:w']) * metadata.size.width), | ||||
|                         height: Math.round(parseFloat('' + regionBox['stArea:h']) * metadata.size.height), | ||||
|                         left: Math.round(parseFloat('' + regionBox['stArea:x']) * metadata.size.width), | ||||
|                         top: Math.round(parseFloat('' + regionBox['stArea:y']) * metadata.size.height) | ||||
|  | ||||
|                     let type, name, box; | ||||
|                     const regionRoot = ret.Regions.value.RegionList.value[i] as any; | ||||
|                     const createFaceBox = (w: string, h: string, x: string, y: string) => { | ||||
|                       return { | ||||
|                         width: Math.round(parseFloat(w) * metadata.size.width), | ||||
|                         height: Math.round(parseFloat(h) * metadata.size.height), | ||||
|                         left: Math.round(parseFloat(x) * metadata.size.width), | ||||
|                         top: Math.round(parseFloat(y) * metadata.size.height) | ||||
|                       }; | ||||
|                       // convert center base box to corner based box | ||||
|                       box.left = Math.max(0, box.left - box.width / 2); | ||||
|                       box.top = Math.max(0, box.top - box.height / 2); | ||||
|                       faces.push({name: name, box: box}); | ||||
|                     } else if((ret.Regions.value.RegionList.value[i] as any).Area && | ||||
|                               (ret.Regions.value.RegionList.value[i] as any).Name && | ||||
|                               (ret.Regions.value.RegionList.value[i] as any).Type) { | ||||
|                       const regionBox = (ret.Regions.value.RegionList.value[i] as any).Area.value; | ||||
|                       const name = (ret.Regions.value.RegionList.value[i] as any).Name.value; | ||||
|                       const type = (ret.Regions.value.RegionList.value[i] as any).Type.value; | ||||
|                       if (type !== 'Face') continue; | ||||
|                       const box = { | ||||
|                         width: Math.round(parseFloat(regionBox.w.value) * metadata.size.width), | ||||
|                         height: Math.round(parseFloat(regionBox.h.value) * metadata.size.height), | ||||
|                         left: Math.round(parseFloat(regionBox.x.value) * metadata.size.width), | ||||
|                         top: Math.round(parseFloat(regionBox.y.value) * metadata.size.height) | ||||
|                       }; | ||||
|                       // convert center base box to corner based box | ||||
|                       box.left = Math.max(0, box.left - box.width / 2); | ||||
|                       box.top = Math.max(0, box.top - box.height / 2); | ||||
|                       faces.push({name: name, box: box}); | ||||
|                     }; | ||||
|  | ||||
|                     /* Adobe Lightroom based face region structure*/ | ||||
|                     if (regionRoot.value && | ||||
|                       regionRoot.value['rdf:Description'] && | ||||
|                       regionRoot.value['rdf:Description'].value && | ||||
|                       regionRoot.value['rdf:Description'].value['mwg-rs:Area']) { | ||||
|  | ||||
|                       const region = regionRoot.value['rdf:Description']; | ||||
|                       const regionBox = region.value['mwg-rs:Area'].attributes; | ||||
|  | ||||
|                       name = region.attributes['mwg-rs:Name']; | ||||
|                       type = region.attributes['mwg-rs:Type']; | ||||
|                       box = createFaceBox(regionBox['stArea:w'], | ||||
|                         regionBox['stArea:h'], | ||||
|                         regionBox['stArea:x'], | ||||
|                         regionBox['stArea:y']); | ||||
|                       /* Load exiftool edited face region structure, see github issue #191 */ | ||||
|                     } else if (regionRoot.Area && regionRoot.Name && regionRoot.Type) { | ||||
|  | ||||
|                       const regionBox = regionRoot.Area.value; | ||||
|                       name = regionRoot.Name.value; | ||||
|                       type = regionRoot.Type.value; | ||||
|                       box = createFaceBox(regionBox.w.value, | ||||
|                         regionBox.h.value, | ||||
|                         regionBox.x.value, | ||||
|                         regionBox.y.value); | ||||
|                     } | ||||
|  | ||||
|                     if (type !== 'Face' || !name) { | ||||
|                       continue; | ||||
|                     } | ||||
|                     // convert center base box to corner based box | ||||
|                     box.left = Math.max(0, box.left - box.width / 2); | ||||
|                     box.top = Math.max(0, box.top - box.height / 2); | ||||
|                     faces.push({name: name, box: box}); | ||||
|                   } | ||||
|                 } | ||||
|                 if (Config.Client.Faces.keywordsToPersons && faces.length > 0) { | ||||
|   | ||||
| Before Width: | Height: | Size: 889 KiB After Width: | Height: | Size: 889 KiB | 
							
								
								
									
										42
									
								
								test/backend/assets/exiftool.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								test/backend/assets/exiftool.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| { | ||||
|   "cameraData": { | ||||
|     "ISO": 160, | ||||
|     "exposure": 0.0008, | ||||
|     "fStop": 5.6, | ||||
|     "focalLength": 85, | ||||
|     "lens": "EF-S15-85mm f/3.5-5.6 IS USM", | ||||
|     "make": "Canon", | ||||
|     "model": "Canon EOS 600D" | ||||
|   }, | ||||
|   "creationDate": 1434116432000, | ||||
|   "faces": [ | ||||
|     { | ||||
|       "box": { | ||||
|         "height": 626, | ||||
|         "left": 374.5, | ||||
|         "top": 353, | ||||
|         "width": 669 | ||||
|       }, | ||||
|       "name": "Alvin the Squirrel" | ||||
|     } | ||||
|   ], | ||||
|   "fileSize": 909930, | ||||
|   "keywords": [ | ||||
|     "USA", | ||||
|     "Yosemite" | ||||
|   ], | ||||
|   "orientation": 1, | ||||
|   "positionData": { | ||||
|     "GPSData": { | ||||
|       "altitude": 1960, | ||||
|       "latitude": 37.746765, | ||||
|       "longitude": -119.52988333333333 | ||||
|     }, | ||||
|     "country": "United States", | ||||
|     "state": "California" | ||||
|   }, | ||||
|   "size": { | ||||
|     "height": 1132, | ||||
|     "width": 1697 | ||||
|   } | ||||
| } | ||||
| @@ -32,6 +32,13 @@ describe('MetadataLoader', () => { | ||||
|   }); | ||||
|  | ||||
|  | ||||
|   it('should load jpg edited with exiftool', async () => { | ||||
|     const data = await MetadataLoader.loadPhotoMetadata(path.join(__dirname, '/../../../assets/exiftool.jpg')); | ||||
|     const expected = require(path.join(__dirname, '/../../../assets/exiftool.json')); | ||||
|     expect(Utils.clone(data)).to.be.deep.equal(expected); | ||||
|   }); | ||||
|  | ||||
|  | ||||
|   it('should load mp4', async () => { | ||||
|     const data = await MetadataLoader.loadVideoMetadata(path.join(__dirname, '/../../../assets/video.mp4')); | ||||
|     const expected = require(path.join(__dirname, '/../../../assets/video.json')); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user