readHeaders static method
Reads segments prior to the entropy-coded data i.e. until the SOS (Start of Scan) segment
Implementation
static List<JpegSegment> readHeaders(Uint8List jpegBytes) {
List<JpegSegment> segments = [];
var jpeg = ByteData.sublistView(jpegBytes);
int offset = 0;
while (true) {
if (jpeg.getUint8(offset) != 0xFF) {
throw new Exception("Missing 0xFF at offset $offset");
}
int type = jpeg.getUint8(offset + 1);
int segmentLength = 2; // for 0xFF + marker type
bool noLengthBytes =
// https://stackoverflow.com/a/4614629
// https://dev.exiv2.org/projects/exiv2/wiki/The_Metadata_in_JPEG_files
(type == 0x00 || type == 0x01 || (type >= 0xD0 && type <= 0xD8));
if (!noLengthBytes) {
segmentLength += jpeg.getUint16(offset + 2, Endian.big);
}
var segment = JpegSegment(ByteData.sublistView(
jpeg,
offset,
offset + segmentLength,
));
// print("read $segment");
segments.add(segment);
if (segment.isStartOfScan) {
break;
}
offset += segmentLength;
}
return segments;
}