@Override public int getOrientation(@NonNull InputStream is, @NonNull ArrayPool byteArrayPool) throws IOException { return getOrientation(new StreamReader(Preconditions.checkNotNull(is)), Preconditions.checkNotNull(byteArrayPool)); }
@Override public int getOrientation(@NonNull ByteBuffer byteBuffer, @NonNull ArrayPool byteArrayPool) throws IOException { return getOrientation(new ByteBufferReader(Preconditions.checkNotNull(byteBuffer)), Preconditions.checkNotNull(byteArrayPool)); }
@Override public void run(DefaultImageHeaderParser parser, ByteBuffer byteBuffer, ArrayPool byteArrayPool) throws IOException { assertEquals(-1, parser.getOrientation(byteBuffer, byteArrayPool)); } });
@Override public void run(DefaultImageHeaderParser parser, InputStream is, ArrayPool byteArrayPool) throws IOException { assertEquals(-1, parser.getOrientation(is, byteArrayPool)); } @Override
@Test public void getOrientation_withExifSegmentAndPreambleButLessThanLength_returnsUnknown() throws IOException { ByteBuffer jpegHeaderBytes = getExifMagicNumber(); ByteBuffer exifSegmentPreamble = ByteBuffer.wrap(DefaultImageHeaderParser.JPEG_EXIF_SEGMENT_PREAMBLE_BYTES); ByteBuffer data = ByteBuffer.allocate(2 + 1 + 1 + 2 + exifSegmentPreamble.capacity()); data.put(jpegHeaderBytes) .put((byte) DefaultImageHeaderParser.SEGMENT_START_ID) .put((byte) DefaultImageHeaderParser.EXIF_SEGMENT_TYPE) // SEGMENT_LENGTH, add two because length includes the segment length short, and one to go // beyond the preamble bytes length for the test. .putShort( (short) (DefaultImageHeaderParser.JPEG_EXIF_SEGMENT_PREAMBLE_BYTES.length + 2 + 1)) .put(DefaultImageHeaderParser.JPEG_EXIF_SEGMENT_PREAMBLE_BYTES); data.position(0); DefaultImageHeaderParser parser = new DefaultImageHeaderParser(); assertEquals(ImageHeaderParser.UNKNOWN_ORIENTATION, parser.getOrientation(data, byteArrayPool)); }
@Test public void getOrientation_withExifSegmentAndPreambleBetweenLengthAndExpected_returnsUnknown() throws IOException { ByteBuffer jpegHeaderBytes = getExifMagicNumber(); ByteBuffer exifSegmentPreamble = ByteBuffer.wrap(DefaultImageHeaderParser.JPEG_EXIF_SEGMENT_PREAMBLE_BYTES); ByteBuffer data = ByteBuffer.allocate(2 + 1 + 1 + 2 + exifSegmentPreamble.capacity() + 2 + 1); data.put(jpegHeaderBytes) .put((byte) DefaultImageHeaderParser.SEGMENT_START_ID) .put((byte) DefaultImageHeaderParser.EXIF_SEGMENT_TYPE) // SEGMENT_LENGTH, add two because length includes the segment length short, and one to go // beyond the preamble bytes length for the test. .putShort( (short) (DefaultImageHeaderParser.JPEG_EXIF_SEGMENT_PREAMBLE_BYTES.length + 2 + 1)) .put(DefaultImageHeaderParser.JPEG_EXIF_SEGMENT_PREAMBLE_BYTES); data.position(0); DefaultImageHeaderParser parser = new DefaultImageHeaderParser(); assertEquals(ImageHeaderParser.UNKNOWN_ORIENTATION, parser.getOrientation(data, byteArrayPool)); }
@Test public void testIssue387() throws IOException { InputStream is = TestResourceUtil.openResource(getClass(), "issue387_rotated_jpeg.jpg"); assertThat(new DefaultImageHeaderParser().getOrientation(is, byteArrayPool)).isEqualTo(6); }
@Test public void getOrientation_withExifSegmentLessThanLength_returnsUnknown() throws IOException { ByteBuffer jpegHeaderBytes = getExifMagicNumber(); byte[] data = new byte[] { jpegHeaderBytes.get(0), jpegHeaderBytes.get(1), (byte) DefaultImageHeaderParser.SEGMENT_START_ID, (byte) DefaultImageHeaderParser.EXIF_SEGMENT_TYPE, // SEGMENT_LENGTH (byte) 0xFF, (byte) 0xFF, }; ByteBuffer byteBuffer = ByteBuffer.wrap(data); DefaultImageHeaderParser parser = new DefaultImageHeaderParser(); assertEquals(ImageHeaderParser.UNKNOWN_ORIENTATION, parser.getOrientation(byteBuffer, byteArrayPool)); }
private void assertOrientation(String filePrefix, int expectedOrientation) { InputStream is = null; try { is = open(filePrefix + "_" + expectedOrientation + ".jpg"); assertEquals(new DefaultImageHeaderParser().getOrientation(is, byteArrayPool), expectedOrientation); } catch (IOException e) { throw new RuntimeException(e); } finally { if (is != null) { try { is.close(); } catch (IOException e) { // Do nothing. } } } }
@Test public void getOrientation_withNonExifSegmentLessThanLength_returnsUnknown() throws IOException { ByteBuffer jpegHeaderBytes = getExifMagicNumber(); byte[] data = new byte[] { jpegHeaderBytes.get(0), jpegHeaderBytes.get(1), (byte) DefaultImageHeaderParser.SEGMENT_START_ID, // SEGMENT_TYPE (NOT EXIF_SEGMENT_TYPE) (byte) 0xE5, // SEGMENT_LENGTH (byte) 0xFF, (byte) 0xFF, }; ByteBuffer byteBuffer = ByteBuffer.wrap(data); DefaultImageHeaderParser parser = new DefaultImageHeaderParser(); assertEquals(ImageHeaderParser.UNKNOWN_ORIENTATION, parser.getOrientation(byteBuffer, byteArrayPool)); }
@Test public void testHandlesPartialReads() throws IOException { InputStream is = TestResourceUtil.openResource(getClass(), "issue387_rotated_jpeg.jpg"); DefaultImageHeaderParser parser = new DefaultImageHeaderParser(); assertThat(parser.getOrientation(new PartialReadInputStream(is), byteArrayPool)).isEqualTo(6); }
@Test public void testHandlesPartialSkips() throws IOException { InputStream is = TestResourceUtil.openResource(getClass(), "issue387_rotated_jpeg.jpg"); DefaultImageHeaderParser parser = new DefaultImageHeaderParser(); assertThat(parser.getOrientation(new PartialSkipInputStream(is), byteArrayPool)).isEqualTo(6); }
@Test public void testIncludesGivenExifOrientation() throws IOException { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { InputStream toWrap = openOrientationExample(true /*isLandscape*/, j + 1); InputStream wrapped = new ExifOrientationStream(toWrap, i); DefaultImageHeaderParser parser = new DefaultImageHeaderParser(); assertThat(parser.getOrientation(wrapped, byteArrayPool)).isEqualTo(i); toWrap = openOrientationExample(false /*isLandscape*/, j + 1); wrapped = new ExifOrientationStream(toWrap, i); assertThat(parser.getOrientation(wrapped, byteArrayPool)).isEqualTo(i); } } } }
@Override public int getOrientation(InputStream is, ArrayPool byteArrayPool) throws IOException { return getOrientation(new StreamReader(Preconditions.checkNotNull(is)), Preconditions.checkNotNull(byteArrayPool)); }
@Override public int getOrientation(ByteBuffer byteBuffer, ArrayPool byteArrayPool) throws IOException { return getOrientation(new ByteBufferReader(Preconditions.checkNotNull(byteBuffer)), Preconditions.checkNotNull(byteArrayPool)); }