]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/jpeg/drew/JpegSegmentReader.java
Version 19, May 2018
[GpsPrune.git] / tim / prune / jpeg / drew / JpegSegmentReader.java
diff --git a/tim/prune/jpeg/drew/JpegSegmentReader.java b/tim/prune/jpeg/drew/JpegSegmentReader.java
deleted file mode 100644 (file)
index 65515a1..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-package tim.prune.jpeg.drew;\r
-\r
-import java.io.*;\r
-\r
-/**\r
- * Class to perform read functions of Jpeg files, returning specific file segments\r
- * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com\r
- */\r
-public class JpegSegmentReader\r
-{\r
-       /** Start of scan marker */\r
-       private static final byte SEGMENT_SOS = (byte)0xDA;\r
-\r
-       /** End of image marker */\r
-       private static final byte MARKER_EOI = (byte)0xD9;\r
-\r
-       /** APP1 Jpeg segment identifier -- where Exif data is kept. */\r
-       private static final byte SEGMENT_APP1 = (byte)0xE1;\r
-\r
-       /** Magic numbers to mark the beginning of all Jpegs */\r
-       private static final int MAGIC_JPEG_BYTE_1 = 0xFF;\r
-       private static final int MAGIC_JPEG_BYTE_2 = 0xD8;\r
-\r
-\r
-       /**\r
-        * Get the Exif data segment for the specified file\r
-        * @param inFile File to read\r
-        * @return Exif data segment as byte array\r
-        * @throws JpegException on file read errors or exif data errors\r
-        */\r
-       public static byte[] readExifSegment(File inFile) throws JpegException\r
-       {\r
-               JpegSegmentData data = readSegments(inFile);\r
-               return data.getSegment(SEGMENT_APP1);\r
-       }\r
-\r
-\r
-       /**\r
-        * Obtain the Jpeg segment data from the specified file\r
-        * @param inFile File to read\r
-        * @return Jpeg segment data from file\r
-        * @throws JpegException on file read errors or exif data errors\r
-        */\r
-       private static JpegSegmentData readSegments(File inFile) throws JpegException\r
-       {\r
-               JpegSegmentData segmentData = new JpegSegmentData();\r
-               BufferedInputStream bStream = null;\r
-\r
-               try\r
-               {\r
-                       bStream = new BufferedInputStream(new FileInputStream(inFile));\r
-                       // first two bytes should be jpeg magic number\r
-                       final int magic1 = bStream.read() & 0xFF;\r
-                       final int magic2 = bStream.read() & 0xFF;\r
-                       if (magic1 != MAGIC_JPEG_BYTE_1 || magic2 != MAGIC_JPEG_BYTE_2) {\r
-                               throw new JpegException("not a jpeg file");\r
-                       }\r
-\r
-                       // Loop around segments found\r
-                       boolean foundExif = false;\r
-                       do\r
-                       {\r
-                               // next byte is 0xFF\r
-                               byte segmentIdentifier = (byte) (bStream.read() & 0xFF);\r
-                               if ((segmentIdentifier & 0xFF) != 0xFF)\r
-                               {\r
-                                       throw new JpegException("expected jpeg segment start 0xFF, not 0x"\r
-                                               + Integer.toHexString(segmentIdentifier & 0xFF));\r
-                               }\r
-                               // next byte is <segment-marker>\r
-                               byte thisSegmentMarker = (byte) (bStream.read() & 0xFF);\r
-                               // next 2-bytes are <segment-size>: [high-byte] [low-byte]\r
-                               byte[] segmentLengthBytes = new byte[2];\r
-                               bStream.read(segmentLengthBytes, 0, 2);\r
-                               int segmentLength = ((segmentLengthBytes[0] << 8) & 0xFF00) | (segmentLengthBytes[1] & 0xFF);\r
-                               // segment length includes size bytes, so subtract two\r
-                               segmentLength -= 2;\r
-                               if (segmentLength > bStream.available())\r
-                                       throw new JpegException("segment size would extend beyond file stream length");\r
-                               else if (segmentLength < 0)\r
-                                       throw new JpegException("segment size would be less than zero");\r
-                               byte[] segmentBytes = new byte[segmentLength];\r
-                               int bytesRead = bStream.read(segmentBytes, 0, segmentLength);\r
-                               // Bail if not all bytes read in one go - otherwise following sections will be out of step\r
-                               if (bytesRead != segmentLength) {\r
-                                       throw new JpegException("Tried to read " + segmentLength + " bytes but only got " + bytesRead);\r
-                               }\r
-                               if ((thisSegmentMarker & 0xFF) == (SEGMENT_SOS & 0xFF))\r
-                               {\r
-                                       // The 'Start-Of-Scan' segment comes last so break out of loop\r
-                                       break;\r
-                               }\r
-                               else if ((thisSegmentMarker & 0xFF) == (MARKER_EOI & 0xFF))\r
-                               {\r
-                                       // the 'End-Of-Image' segment - should already have exited by now\r
-                                       break;\r
-                               }\r
-                               else\r
-                               {\r
-                                       segmentData.addSegment(thisSegmentMarker, segmentBytes);\r
-                               }\r
-                               // loop through to the next segment if exif hasn't already been found\r
-                               foundExif = (thisSegmentMarker == SEGMENT_APP1);\r
-                       }\r
-                       while (!foundExif);\r
-               }\r
-               catch (FileNotFoundException fnfe)\r
-               {\r
-                       throw new JpegException("Jpeg file not found");\r
-               }\r
-               catch (IOException ioe)\r
-               {\r
-                       throw new JpegException("IOException processing Jpeg file: " + ioe.getMessage(), ioe);\r
-               }\r
-               finally\r
-               {\r
-                       try\r
-                       {\r
-                               if (bStream != null) {\r
-                                       bStream.close();\r
-                               }\r
-                       }\r
-                       catch (IOException ioe) {\r
-                               throw new JpegException("IOException processing Jpeg file: " + ioe.getMessage(), ioe);\r
-                       }\r
-               }\r
-               // Return the result\r
-               return segmentData;\r
-       }\r
-}\r