Add EXIF service

search-pin^2
Alix JEUDI--LEMOINE 3 months ago
parent 527f33ca7c
commit 1c5de5099c

@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { ExifService } from './exif.service';
describe('ExifService', () => {
let service: ExifService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(ExifService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

@ -0,0 +1,87 @@
import { Injectable } from '@angular/core';
import exifr from 'exifr';
@Injectable({
providedIn: 'root'
})
export class ExifService {
private getExifData(file: File): Promise<any> {
// console.log('getExifData(file)');
// return new Promise((resolve, reject) => {
// console.log('getExifData(file) -> Promise');
// const reader = new FileReader();
// console.log('getExifData(file) -> Promise -> reader');
// reader.onload = (event: any) => {
// console.log('getExifData(file) -> Promise -> reader -> onload');
// EXIF.getData(event.target.result, function() {
// console.log('getExifData(file) -> Promise -> reader -> onload -> EXIF.getData');
// const allExifData = EXIF.getAllTags(this);
// console.log('getExifData(file) -> Promise -> reader -> onload -> EXIF.getData -> getAllTags');
// resolve(allExifData);
// });
// };
// reader.onerror = (error) => reject(error);
// reader.readAsArrayBuffer(file);
// });
return exifr.parse(file);
}
async getAllExifData(file: File): Promise<any> {
try {
return await this.getExifData(file);
} catch (error) {
console.error('Error reading EXIF data:', error);
return
}
}
async getOrientation(file: File): Promise<number | undefined> {
try {
const exifData = await this.getExifData(file);
return exifData.Orientation;
} catch (error) {
console.error('Error reading EXIF data:', error);
return undefined;
}
}
async getDeviceModel(file: File): Promise<string | undefined> {
try {
const exifData = await this.getExifData(file);
return exifData.Model;
} catch (error) {
console.error('Error reading EXIF data:', error);
return undefined;
}
}
async getLocation(file: File): Promise<{ latitude?: number; longitude?: number }> {
try {
const exifData = await this.getExifData(file);
return {
latitude: exifData.GPSLatitude ? this.convertToDecimal(exifData.GPSLatitude, exifData.GPSLatitudeRef) : undefined,
longitude: exifData.GPSLongitude ? this.convertToDecimal(exifData.GPSLongitude, exifData.GPSLongitudeRef) : undefined
};
} catch (error) {
console.error('Error reading EXIF data:', error);
return {};
}
}
async getDateTime(file: File): Promise<string | boolean> {
try {
const exifData = await this.getExifData(file);
return exifData.DateTime;
} catch (error) {
console.error('Error reading EXIF data:', error);
return false;
}
}
private convertToDecimal(coordinate: number[], direction: string): number {
if (!coordinate || coordinate.length !== 3) return NaN;
const decimal = coordinate[0] + coordinate[1] / 60 + coordinate[2] / 3600;
return (direction === 'S' || direction === 'W') ? -decimal : decimal;
}
}
Loading…
Cancel
Save