commit
f01fb82c3c
@ -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…
Reference in new issue