in src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java [934:1020]
public List<Segment> readSegments(final ByteSource byteSource, final int[] markers, final boolean returnAfterFirst) throws ImagingException, IOException {
final List<Segment> result = new ArrayList<>();
final int[] sofnSegments = {
// kJFIFMarker,
JpegConstants.SOF0_MARKER,
JpegConstants.SOF1_MARKER,
JpegConstants.SOF2_MARKER,
JpegConstants.SOF3_MARKER,
JpegConstants.SOF5_MARKER,
JpegConstants.SOF6_MARKER,
JpegConstants.SOF7_MARKER,
JpegConstants.SOF9_MARKER,
JpegConstants.SOF10_MARKER,
JpegConstants.SOF11_MARKER,
JpegConstants.SOF13_MARKER,
JpegConstants.SOF14_MARKER,
JpegConstants.SOF15_MARKER,
};
final JpegUtils.Visitor visitor = new JpegUtils.Visitor() {
// return false to exit before reading image data.
@Override
public boolean beginSos() {
return false;
}
// return false to exit traversal.
@Override
public boolean visitSegment(final int marker, final byte[] markerBytes,
final int markerLength, final byte[] markerLengthBytes,
final byte[] segmentData) throws ImagingException, IOException {
if (marker == JpegConstants.EOI_MARKER) {
return false;
}
// Debug.debug("visitSegment marker", marker);
// // Debug.debug("visitSegment keepMarker(marker, markers)",
// keepMarker(marker, markers));
// Debug.debug("visitSegment keepMarker(marker, markers)",
// keepMarker(marker, markers));
if (!keepMarker(marker, markers)) {
return true;
}
switch (marker) {
case JpegConstants.JPEG_APP13_MARKER:
// Debug.debug("app 13 segment data", segmentData.length);
result.add(new App13Segment(marker, segmentData));
break;
case JpegConstants.JPEG_APP14_MARKER:
result.add(new App14Segment(marker, segmentData));
break;
case JpegConstants.JPEG_APP2_MARKER:
result.add(new App2Segment(marker, segmentData));
break;
case JpegConstants.JFIF_MARKER:
result.add(new JfifSegment(marker, segmentData));
break;
default:
if (Arrays.binarySearch(sofnSegments, marker) >= 0) {
result.add(new SofnSegment(marker, segmentData));
} else if (marker == JpegConstants.DQT_MARKER) {
result.add(new DqtSegment(marker, segmentData));
} else if ((marker >= JpegConstants.JPEG_APP1_MARKER)
&& (marker <= JpegConstants.JPEG_APP15_MARKER)) {
result.add(new UnknownSegment(marker, segmentData));
} else if (marker == JpegConstants.COM_MARKER) {
result.add(new ComSegment(marker, segmentData));
}
break;
}
return !returnAfterFirst;
}
@Override
public void visitSos(final int marker, final byte[] markerBytes,
final byte[] imageData) {
// don't need image data
}
};
new JpegUtils().traverseJfif(byteSource, visitor);
return result;
}