export declare enum IFDType {
    Byte = 1,
    Ascii = 2,
    Short = 3,
    Long = 4,
    Rational = 5,
    Undefined = 7,
    SignedShort = 8,
    Slong = 9,
    Srational = 10,
    Float = 11,
    Double = 12
}
export type IFDValue<Type extends IFDType> = Type extends IFDType.Ascii ? string : Type extends IFDType.Undefined ? ArrayBuffer : number[];
export interface IFDScheme {
    [name: string]: {
        tag: number;
        type: IFDType;
    };
}
export type IFDDecodeResult<Scheme extends IFDScheme> = {
    [K in keyof Scheme]: IFDValue<Scheme[K]['type']>;
};
export declare function decodeIFD<Scheme extends IFDScheme>(data: ArrayBuffer, scheme: Scheme): IFDDecodeResult<Scheme>;
export interface IFDData {
    [name: string]: {
        tag: number;
        type: IFDType.Ascii;
        value: string;
    } | {
        tag: number;
        type: IFDType.Undefined;
        value: ArrayBuffer;
    } | {
        tag: number;
        type: Exclude<IFDType, IFDType.Ascii | IFDType.Undefined>;
        value: number[];
    };
}
export declare function encodeIFD(data: IFDData): ArrayBuffer;
