57 lines
1.6 KiB
JavaScript
57 lines
1.6 KiB
JavaScript
import * as r from "restructure";
|
|
|
|
import DACMarker from "./markers/dac.js";
|
|
import DefineHuffmanTableMarker from "./markers/dht.js";
|
|
import DQTMarker from "./markers/dqt.js";
|
|
import DRIMarker from "./markers/dri.js";
|
|
import EndOfImageMarker from "./markers/eoi.js";
|
|
import EXIFMarker from "./markers/exif.js";
|
|
import JFIFMarker from "./markers/jfif.js";
|
|
import SOSMarker from "./markers/sos.js";
|
|
import StartOfFrameMarker from "./markers/sof.js";
|
|
import StartOfImageMarker from "./markers/soi.js";
|
|
|
|
const UnknownMarker = {
|
|
length: r.uint16be,
|
|
buf: new r.Buffer((parent) => parent.length - 2),
|
|
};
|
|
|
|
const unknownMarkers = Array(63)
|
|
.fill(0)
|
|
.reduce((acc, v, i) => ({ ...acc, [i + 0xffc0]: UnknownMarker }), {});
|
|
|
|
const Marker = new r.VersionedStruct(r.uint16be, {
|
|
...unknownMarkers,
|
|
0xffc0: StartOfFrameMarker,
|
|
0xffc1: StartOfFrameMarker,
|
|
0xffc2: StartOfFrameMarker,
|
|
0xffc3: StartOfFrameMarker,
|
|
0xffc4: DefineHuffmanTableMarker,
|
|
0xffc5: StartOfFrameMarker,
|
|
0xffc6: StartOfFrameMarker,
|
|
0xffc7: StartOfFrameMarker,
|
|
0xffc9: StartOfFrameMarker,
|
|
0xffca: StartOfFrameMarker,
|
|
0xffcb: StartOfFrameMarker,
|
|
0xffcc: DACMarker,
|
|
0xffcd: StartOfFrameMarker,
|
|
0xffce: StartOfFrameMarker,
|
|
0xffcf: StartOfFrameMarker,
|
|
0xffd8: StartOfImageMarker,
|
|
0xffd9: EndOfImageMarker,
|
|
0xffda: SOSMarker,
|
|
0xffdb: DQTMarker,
|
|
0xffdd: DRIMarker,
|
|
0xffe0: JFIFMarker,
|
|
0xffe1: EXIFMarker,
|
|
});
|
|
|
|
const JPEG = new r.Array(Marker);
|
|
|
|
const decode = (buffer) => {
|
|
const markers = JPEG.fromBuffer(buffer);
|
|
return markers.map(({ version, ...rest }) => ({ type: version, ...rest }));
|
|
};
|
|
|
|
export default { decode };
|