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