/// /// export as namespace ExifReader; interface FileTags { 'FileType'?: 'TIFF' | 'JPEG' | 'PNG' | 'HEIC' | 'AVIF' | 'WebP' | 'GIF', 'Bits Per Sample'?: NumberFileTag, 'Image Height'?: NumberFileTag, 'Image Width'?: NumberFileTag, 'Color Components'?: NumberFileTag, 'Subsampling'?: NumberArrayFileTag } interface JfifTags { 'JFIF Version'?: NumberFileTag, 'Resolution Unit'?: JfifResolutionUnitTag, 'XResolution'?: NumberFileTag, 'YResolution'?: NumberFileTag, 'JFIF Thumbnail Width'?: NumberFileTag, 'JFIF Thumbnail Height'?: NumberFileTag, 'JFIF Thumbnail'?: JfifThumbnailTag } interface JfifResolutionUnitTag { value: number, description: 'None' | 'inches' | 'cm' | 'Unknown' } interface JfifThumbnailTag { value: ArrayBuffer | SharedArrayBuffer | Buffer, description: '<24-bit RGB pixel data>' } interface PngFileTags { 'Image Width'?: NumberFileTag, 'Image Height'?: NumberFileTag, 'Bit Depth'?: NumberFileTag, 'Color Type'?: { value: number, description: 'Grayscale' | 'RGB' | 'Palette' | 'Grayscale with Alpha' | 'RGB with Alpha' | 'Unknown' }, 'Compression'?: { value: number, description: 'Deflate/Inflate' | 'Unknown' }, 'Filter'?: { value: number, description: 'Adaptive' | 'Unknown' }, 'Interlace'?: { value: number, description: 'Noninterlaced' | 'Adam7 Interlace' | 'Unknown' } } interface PngPhysTags { 'Pixels Per Unit X'?: NumberFileTag, 'Pixels Per Unit Y'?: NumberFileTag, 'Pixel Units'?: { value: number, description: 'meters' | 'Unknown' }, 'Modify Date'?: NumberArrayFileTag } interface PngTag { description: string, value: string | number } type PngTags = PngFileTags & PngPhysTags & { [name: string]: PngTag } interface PngTextTag { description: string, value: string } interface PngTextTags { [name: string]: PngTextTag } interface RiffTags { 'Alpha'?: { value: 0 | 1, description: 'No' | 'Yes' }, 'Animation'?: { value: 0 | 1, description: 'No' | 'Yes' }, 'ImageWidth'?: { value: number, description: string }, 'ImageHeight'?: { value: number, description: string }, } interface GifTags { 'GIF Version': { value: '87a' | '89a', description: '87a' | '89a' }, 'Image Width'?: { value: number, description: string }, 'Image Height'?: { value: number, description: string }, 'Global Color Map'?: { value: 0 | 1, description: 'No' | 'Yes' }, 'Bits Per Pixel'?: { value: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8, description: string }, 'Color Resolution Depth'?: { value: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8, description: string }, } interface NumberFileTag { description: string, value: number } interface NumberArrayFileTag { description: string, value: Array } type TypedTag = { id: number, description: string, value: V } type RationalTag = TypedTag<[number, number]> type NumberTag = TypedTag; type NumberArrayTag = TypedTag type StringArrayTag = TypedTag type StringTag = TypedTag; interface ValueTag { description: string, value: string } interface XmpTag { value: string | XmpTag[] | XmpTags, attributes: { [name: string]: string }, description: string } interface XmpTags { [name: string]: XmpTag } interface ThumbnailTags { type: 'image/jpeg', image: ArrayBuffer | SharedArrayBuffer | Buffer, base64: string, Compression: NumberTag, XResolution: RationalTag, YResolution: RationalTag, ResolutionUnit: NumberTag, JPEGInterchangeFormat?: NumberTag, JPEGInterchangeFormatLength?: NumberTag, ImageWidth?: NumberTag, ImageLength?: NumberTag, YCbCrPositioning?: NumberTag, Orientation?: NumberTag, PhotometricInterpretation?: NumberTag, StripOffsets?: NumberArrayTag, SamplesPerPixel?: NumberTag, RowsPerStrip?: NumberTag, StripByteCounts?: NumberArrayTag } export interface ExpandedTags { file?: FileTags, jfif?: JfifTags, pngFile?: PngFileTags, pngText?: PngTextTags, png?: PngTags, exif?: ExifTags, iptc?: ExifTags, xmp?: { _raw: string } & XmpTags, icc?: IccTags, riff?: RiffTags, gif?: GifTags, Thumbnail?: ThumbnailTags, gps?: GpsTags photoshop?: PhotoshopTags; makerNotes?: CanonTags & PentaxTags; composite?: CompositeTags; } interface GpsTags { Latitude?: number, Longitude?: number, Altitude?: number } interface MPFImageTags { ImageFlags: { value: number[], description: string }, ImageFormat: { value: number, description: string }, ImageType: { value: number, description: string }, ImageSize: { value: number, description: string }, ImageOffset: { value: number, description: string }, DependentImage1EntryNumber: { value: number, description: string }, DependentImage2EntryNumber: { value: number, description: string }, image: ArrayBuffer | SharedArrayBuffer | Buffer, base64: string } interface PhotoshopTags { // CaptionDigest: StringTag; // PrintInformation: StringTag; // PrintStyle: StringTag; PathInformation: StringTag; ClippingPathName: StringTag; } interface CanonTags { AutoRotate: { value: number; description: 'None' | 'Rotate 90 CW' | 'Rotate 180' | 'Rotate 270 CW' | 'Unknown'; }; } interface PentaxTags { PentaxVersion: { value: number[]; description: string; }; PentaxModelID: { value: number; description: string; }; Orientation: { value: number; description: 'Horizontal (normal)' | 'Rotate 270 CW' | 'Rotate 180' | 'Rotate 90 CW' | 'Upwards' | 'Downwards' | 'Unknown'; }; RollAngle: { value: number; description: string; }; PitchAngle: { value: number; description: string; }; } interface CompositeTags { FocalLength35efl?: { value: number, description: string, } ScaleFactorTo35mmEquivalent?: { value: number, description: string, }, FieldOfView?: { value: number, description: string, } } export function load(data: ArrayBuffer | SharedArrayBuffer | Buffer): Tags; export function load(data: ArrayBuffer | SharedArrayBuffer | Buffer, options: {expanded: true, includeUnknown?: boolean, length?: number, async?: false}): ExpandedTags; export function load(data: ArrayBuffer | SharedArrayBuffer | Buffer, options: {expanded?: false, includeUnknown?: boolean, length?: number, async?: false}): Tags; export function load(data: ArrayBuffer | SharedArrayBuffer | Buffer, options: {expanded: true, includeUnknown?: boolean, length?: number, async: true}): Promise; export function load(data: ArrayBuffer | SharedArrayBuffer | Buffer, options: {expanded?: false, includeUnknown?: boolean, length?: number, async: true}): Promise; export function load(data: string | File): Promise; export function load(data: string | File, options: {expanded: true, includeUnknown?: boolean, length?: number, async?: boolean}): Promise; export function load(data: string | File, options: {expanded?: false, includeUnknown?: boolean, length?: number, async?: boolean}): Promise; export function loadView(data: DataView): Tags; export function loadView(data: DataView, options: {expanded: true, includeUnknown?: boolean, async?: false}): ExpandedTags; export function loadView(data: DataView, options: {expanded?: false, includeUnknown?: boolean, async?: false}): Tags; export function loadView(data: DataView, options: {expanded: true, includeUnknown?: boolean, async: true}): Promise; export function loadView(data: DataView, options: {expanded?: false, includeUnknown?: boolean, async: true}): Promise; export namespace errors { export class MetadataMissingError extends Error {} } interface ExifTags { // Interoperability tags 'InteroperabilityIndex'?: StringArrayTag, // 0th IFD tags 'ImageWidth'?: NumberTag, 'ImageLength'?: NumberTag, 'BitsPerSample'?: NumberArrayTag, 'Compression'?: NumberTag, 'PhotometricInterpretation'?: NumberTag, 'DocumentName'?: StringArrayTag, 'ImageDescription'?: StringArrayTag, 'Make'?: StringArrayTag, 'Model'?: StringArrayTag, 'StripOffsets'?: NumberArrayTag, 'Orientation'?: NumberTag, 'SamplesPerPixel'?: NumberTag, 'RowsPerStrip'?: NumberTag, 'StripByteCounts'?: NumberArrayTag, 'XResolution'?: RationalTag | NumberFileTag, // Also in JFIF tags. 'YResolution'?: RationalTag | NumberFileTag, // Also in JFIF tags. 'PlanarConfiguration'?: NumberTag, 'ResolutionUnit'?: NumberTag, 'TransferFunction'?: NumberArrayTag, 'Software'?: StringArrayTag, 'DateTime'?: StringArrayTag, 'Artist'?: StringArrayTag, 'WhitePoint'?: NumberArrayTag, 'PrimaryChromaticities'?: NumberArrayTag, 'JPEGInterchangeFormat'?: NumberTag, 'JPEGInterchangeFormatLength'?: NumberTag, 'YCbCrCoefficients'?: NumberArrayTag, 'YCbCrSubSampling'?: NumberArrayTag, 'YCbCrPositioning'?: NumberTag, 'ReferenceBlackWhite'?: NumberArrayTag, 'Copyright'?: StringArrayTag, 'Exif IFD Pointer'?: NumberTag, 'GPS Info IFD Pointer'?: NumberTag, // JFIF tags 'JFIF Version'?: NumberFileTag, 'Resolution Unit'?: JfifResolutionUnitTag, 'JFIF Thumbnail Width'?: NumberFileTag, 'JFIF Thumbnail Height'?: NumberFileTag, 'JFIF Thumbnail'?: JfifThumbnailTag, // Exif tags 'ExposureTime'?: RationalTag, 'FNumber'?: RationalTag, 'ExposureProgram'?: NumberTag, 'SpectralSensitivity'?: StringArrayTag, 'ISOSpeedRatings'?: NumberTag | NumberArrayTag, 'OECF'?: unknown, 'ExifVersion'?: NumberArrayTag, 'DateTimeOriginal'?: StringArrayTag, 'DateTimeDigitized'?: StringArrayTag, 'ComponentsConfiguration'?: NumberArrayTag, 'CompressedBitsPerPixel'?: RationalTag, 'ShutterSpeedValue'?: RationalTag, 'ApertureValue'?: RationalTag, 'BrightnessValue'?: RationalTag, 'ExposureBiasValue'?: RationalTag, 'MaxApertureValue'?: RationalTag, 'SubjectDistance'?: RationalTag, 'MeteringMode'?: NumberTag, 'LightSource'?: NumberTag, 'Flash'?: NumberTag, 'FocalLength'?: RationalTag, 'SubjectArea'?: NumberArrayTag, 'MakerNote'?: unknown, 'UserComment'?: unknown, 'SubSecTime'?: StringArrayTag, 'SubSecTimeOriginal'?: StringArrayTag, 'SubSecTimeDigitized'?: StringArrayTag, 'FlashpixVersion'?: NumberArrayTag, 'ColorSpace'?: NumberTag, 'PixelXDimension'?: NumberTag, 'PixelYDimension'?: NumberTag, 'RelatedSoundFile'?: StringArrayTag, 'Interoperability IFD Pointer'?: NumberTag, 'FlashEnergy'?: NumberTag, 'SpatialFrequencyResponse'?: unknown, 'FocalPlaneXResolution'?: RationalTag, 'FocalPlaneYResolution'?: RationalTag, 'FocalPlaneResolutionUnit'?: NumberTag, 'SubjectLocation'?: NumberArrayTag, 'ExposureIndex'?: RationalTag, 'SensingMethod'?: NumberTag, 'FileSource'?: NumberTag, 'SceneType'?: NumberTag, 'CFAPattern'?: unknown, 'CustomRendered'?: NumberTag, 'ExposureMode'?: NumberTag, 'WhiteBalance'?: NumberTag, 'DigitalZoomRatio'?: RationalTag, 'FocalLengthIn35mmFilm'?: NumberTag, 'SceneCaptureType'?: NumberTag, 'GainControl'?: NumberTag, 'Contrast'?: NumberTag, 'Saturation'?: NumberTag, 'Sharpness'?: NumberTag, 'DeviceSettingDescription'?: unknown, 'SubjectDistanceRange'?: NumberTag, 'ImageUniqueID'?: StringArrayTag, 'LensMake'?: StringArrayTag, 'LensModel'?: StringArrayTag, 'OffsetTime'?: StringArrayTag, 'OffsetTimeDigitized'?: StringArrayTag, 'OffsetTimeOriginal'?: StringArrayTag, 'GPSHPositioningError'?: NumberArrayTag, // GPS tags 'GPSVersionID'?: NumberTag, 'GPSLatitudeRef'?: StringArrayTag, 'GPSLatitude'?: TypedTag<[[number, number], [number, number], [number, number]]>, 'GPSLongitudeRef'?: StringArrayTag, 'GPSLongitude'?: TypedTag<[[number, number], [number, number], [number, number]]>, 'GPSAltitudeRef'?: NumberTag, 'GPSAltitude'?: RationalTag, 'GPSTimeStamp'?: NumberArrayTag, 'GPSSatellites'?: StringArrayTag, 'GPSStatus'?: StringArrayTag, 'GPSMeasureMode'?: StringArrayTag, 'GPSDOP'?: NumberTag, 'GPSSpeedRef'?: StringArrayTag, 'GPSSpeed'?: NumberTag, 'GPSTrackRef'?: StringArrayTag, 'GPSTrack'?: NumberTag, 'GPSImgDirectionRef'?: StringArrayTag, 'GPSImgDirection'?: RationalTag, 'GPSMapDatum'?: StringArrayTag, 'GPSDestLatitudeRef'?: StringArrayTag, 'GPSDestLatitude'?: NumberArrayTag, 'GPSDestLongitudeRef'?: StringArrayTag, 'GPSDestLongitude'?: NumberArrayTag, 'GPSDestBearingRef'?: StringArrayTag, 'GPSDestBearing'?: NumberTag, 'GPSDestDistanceRef'?: StringArrayTag, 'GPSDestDistance'?: NumberTag, 'GPSProcessingMethod'?: unknown, 'GPSAreaInformation'?: unknown, 'GPSDateStamp'?: StringArrayTag, 'GPSDifferential'?: NumberTag, // MPF tags 'MPFVersion'?: NumberArrayTag, 'NumberOfImages'?: NumberTag, 'MPEntry'?: NumberArrayTag, 'ImageUIDList'?: NumberArrayTag, 'TotalFrames'?: NumberTag, 'Images'?: MPFImageTags[], // IPTC tags // IPTC tags don't have explicit types. Therefore the raw value will always // be an array of numbers. Maybe it could be changed in the code to add the // types afterwards. In that case the types are listed as comments below. 'Model Version'?: NumberArrayTag, // NumberTag 'Destination'?: NumberArrayTag, // StringTag 'File Format'?: NumberArrayTag, // NumberTag 'File Format Version'?: NumberArrayTag, // NumberTag 'Service Identifier'?: NumberArrayTag, // StringTag 'Envelope Number'?: NumberArrayTag, // StringTag 'Product ID'?: NumberArrayTag, // StringTag 'Envelope Priority'?: NumberArrayTag, // StringTag 'Date Sent'?: NumberArrayTag, // StringTag 'Time Sent'?: NumberArrayTag, // StringTag 'Coded Character Set'?: NumberArrayTag, // StringTag 'UNO'?: NumberArrayTag, // StringTag 'ARM Identifier'?: NumberArrayTag, // NumberTag 'ARM Version'?: NumberArrayTag, // NumberTag 'Record Version'?: NumberArrayTag, // NumberTag 'Object Type Reference'?: NumberArrayTag, // StringTag 'Object Attribute Reference'?: NumberArrayTag, // StringTag 'Object Name'?: NumberArrayTag, // StringTag 'Edit Status'?: NumberArrayTag, // StringTag 'Editorial Update'?: NumberArrayTag, // StringTag 'Urgency'?: NumberArrayTag, // StringTag 'Subject Reference'?: NumberArrayTag, // StringTag 'Category'?: NumberArrayTag, // StringTag 'Supplemental Category'?: NumberArrayTag, // StringTag 'Fixture Identifier'?: NumberArrayTag, // StringTag 'Keywords'?: NumberArrayTag | NumberArrayTag[], // StringTag 'Content Location Code'?: NumberArrayTag, // StringTag 'Content Location Name'?: NumberArrayTag, // StringTag 'Release Date'?: NumberArrayTag, // StringTag 'Release Time'?: NumberArrayTag, // StringTag 'Expiration Date'?: NumberArrayTag, // StringTag 'Expiration Time'?: NumberArrayTag, // StringTag 'Special Instructions'?: NumberArrayTag, // StringTag 'Action Advised'?: NumberArrayTag, // StringTag 'Reference Service'?: NumberArrayTag, // StringTag 'Reference Date'?: NumberArrayTag, // StringTag 'Reference Number'?: NumberArrayTag, // StringTag 'Date Created'?: NumberArrayTag, // StringTag 'Time Created'?: NumberArrayTag, // StringTag 'Digital Creation Date'?: NumberArrayTag, // StringTag 'Digital Creation Time'?: NumberArrayTag, // StringTag 'Originating Program'?: NumberArrayTag, // StringTag 'Program Version'?: NumberArrayTag, // StringTag 'Object Cycle'?: NumberArrayTag, // StringTag 'By-line'?: NumberArrayTag, // StringTag 'By-line Title'?: NumberArrayTag, // StringTag 'City'?: NumberArrayTag, // StringTag 'Sub-location'?: NumberArrayTag, // StringTag 'Province/State'?: NumberArrayTag, // StringTag 'Country/Primary Location Code'?: NumberArrayTag, // StringTag 'Country/Primary Location Name'?: NumberArrayTag, // StringTag 'Original Transmission Reference'?: NumberArrayTag, // StringTag 'Headline'?: NumberArrayTag, // StringTag 'Credit'?: NumberArrayTag, // StringTag 'Source'?: NumberArrayTag, // StringTag 'Copyright Notice'?: NumberArrayTag, // StringTag 'Contact'?: NumberArrayTag, // StringTag 'Caption/Abstract'?: NumberArrayTag, // StringTag 'Writer/Editor'?: NumberArrayTag, // StringTag 'Rasterized Caption'?: NumberArrayTag, // NumberArrayTag 'Image Type'?: NumberArrayTag, // StringTag 'Image Orientation'?: NumberArrayTag, // StringTag 'Language Identifier'?: NumberArrayTag, // StringTag 'Audio Type'?: NumberArrayTag, // StringTag 'Audio Sampling Rate'?: NumberArrayTag, // StringTag 'Audio Sampling Resolution'?: NumberArrayTag, // StringTag 'Audio Duration'?: NumberArrayTag, // StringTag 'Audio Outcue'?: NumberArrayTag, // StringTag 'Short Document ID'?: NumberArrayTag, // NumberTag 'Unique Document ID'?: NumberArrayTag, // NumberTag 'Owner ID'?: NumberArrayTag, // NumberTag 'ObjectData Preview File Format'?: NumberArrayTag, // NumberArrayTag 'Record 2 destination'?: NumberArrayTag, // NumberArrayTag 'ObjectData Preview File Format Version'?: NumberArrayTag, // NumberTag 'ObjectData Preview Data'?: NumberArrayTag, // NumberTag 'Size Mode'?: NumberArrayTag, // NumberTag 'Max Subfile Size'?: NumberArrayTag, // NumberTag 'ObjectData Size Announced'?: NumberArrayTag, // NumberTag 'Maximum ObjectData Size'?: NumberArrayTag, // NumberTag 'Thumbnail'?: ThumbnailTags } interface IccTags { [name: string]: ValueTag; } export type Tags = XmpTags & IccTags & PngTags & RiffTags & GifTags & PhotoshopTags & CanonTags & PentaxTags & CompositeTags & { 'Thumbnail'?: ThumbnailTags; 'Images'?: MPFImageTags[], } & { [K in keyof ExifTags]: ExifTags[K] | XmpTag; }