JPEG File Contents Analysis[Back] This is a page for JPEG file analysis which uses a JFIF header. Upload a JPEG file (or try a sample file): Try an example
What are we looking for?For a JPEG file, we look for the byte sequence FFD8 or the ASCII sequence of JFIF Try your ownOr enter your own URL to analyse the first six sectors of the file: The JPG file is well organised and contains several tags such as the start of the header (FFE0h), Start of Image (FFD8h), Huffman Tabe (FFC4h), and so on. |
File contents analysisStarting tag (should be FFD8): FFD8 Detailed AnalysisFound FFD8 tag (Start of image). Pos: 0 Found FFE0 tag (JPEG file identifier). Pos: 2Length: 16 JPEG: Found FFDB tag (Quantization Table). Pos: 55, Segment: 0 JPEG: Found FFC0 tag (Start Of Frame (Baseline DCT)). Pos: 189, Segment: 0 JPEG: Found FFC4 tag (Huffman Table). Pos: 208, Segment: 0 JPEG: Found FFDA tag (Start Of Scan). Pos: 395, Segment: 0 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 1663, Segment: 3 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 1725, Segment: 3 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 1893, Segment: 3 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 1925, Segment: 3 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 1945, Segment: 3 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 1981, Segment: 3 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 2025, Segment: 3 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 2101, Segment: 4 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 2205, Segment: 4 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 2223, Segment: 4 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 2238, Segment: 4 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 2372, Segment: 4 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 2381, Segment: 4 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 3411, Segment: 6 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 3659, Segment: 7 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 4147, Segment: 8 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 5874, Segment: 11 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 6962, Segment: 13 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 7009, Segment: 13 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 7070, Segment: 13 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 7186, Segment: 14 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 7211, Segment: 14 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 7218, Segment: 14 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 7277, Segment: 14 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 7301, Segment: 14 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 7429, Segment: 14 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 8103, Segment: 15 JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: 8162, Segment: 15 File signature analysis (Header analysis)JPEG file (Starts with 0xff 0xD8)Additional scanning signature analysisPossible: [Postcript file), sig: 2521] Count: 1 File hex characters[00000000] FF D8 FF E0 00 10 4A 46 49 46 00 01 02 00 00 64 ......JFIF.....d Base-64 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 Small update to the video: Run Length Encoding is used to compress the zeros, and Huffman Coding produces small codes for the most popular symbols. |
Some theory
The GIF format is an excellent format for compressing images which have a limited range of colors. This is fine for simple images, but it does not suit the compression of photographs, thus the JPEG standard was developed by the Joint Photographic Expert Group (JPEG), which is a subcommittee of the ISO/IEC. It was based on research into compression ratios on images and their resulting image quality. The standards produced can be summarized as follows:
It is a compression technique for grey-scale or color images and uses a combination of discrete cosine transform, quantization, run-length and Huffman coding.
JPEG is an excellent compression technique which produces lossy compression (although in one mode it is lossless). As seen from the previous section it has excellent compression ratios when applied to a color image. The main steps are:
- Data blocks Generation of data blocks
- Source encoding Discrete cosine transform and quantization
- Entropy encoding Run-length encoding and Huffman encoding
Unfortunately, compared with GIF, TIFF and PCX, the compression process is relatively slow. It is also lossy in that some information is lost in the compression process. This information is perceived to have little effect on the decoded image. GIF files typically use 24-bit color information (8 bits for red, 8 bits for green and 8 bits for blue) and convert it into an 8-bit color palette (thus reducing the number of bits stored to approximately one-third of the original). It then uses LZW compression to further reduce the storage. JPEG operates differently in that it stores changes in color. As the eye is very sensitive to brightness changes it is particularly sensitive to changes in brightness. If these changes are similar to the original then the eye will perceive the recovered image as similar to the original. Color conversion and subsampling
In the first part of the JPEG compression, each color component (red, green and blue) is separated in luminance (brightness) and chrominance (color information). JPEG allows more losses on the chromi-nance and less on the luminance. This is because the human eye is less sensitive to color changes than to brightness changes. In an RGB image, all three channels carry some brightness information but the green component has a stronger effect on brightness than the blue component. A typical scheme for converting RGB into luminance and color is known as CCIR 601, which con-verts the components into Y (can be equated to brightness), Cb (blueness) and Cr (redness). The Y component can be used as a black and white version of the image. The components are computed from the RGB components:
Y = 0.299R+0.587G+0.114B Cb = 0.1687R–0.3313G+0.5B Cr = 0.5R–0.4187G+0.0813B
For the brightness, it can be seen that green has the most effect and blue has the least. For the redness, the red color (of course) has the most effect and green the least, and for the blueness, the blue color has the most effect and green the least. Note that the YCbCr components are often known as YUV. A subsampling process is then conducted which samples the Cb and Cr components at a lower rate than the Y component. A typical sampling rate is four samples of the Y component to a single sample on the Cb and Cr component. This sampling rate is normally set with the compression parameters. The lower the sampling, the smaller the compressed data and the shorter the compression time. All the required information on how to decode the JPEG data is contained in the JPEG header.
DCT coding
The DCT (discrete cosine transform) converts intensity data into frequency data, which can be used to tell how fast the intensities vary. In JPEG coding the image is segmented into 88 pixel rectangles, as illustrated in Figure B2.8. If the image contains several components (such as Y,Cb,Cr or R,G,B), then each of the components in the pixel blocks is operated on separately. If an image is subsampled, there will be more blocks of some components than of others. For example, for 22 sampling there will be four blocks of Y data for each block of Cb or Cr data. The data points in the 8x8 pixel array start at the upper right at (0,0) and finish at the lower right at (7,7). At the point (x,y) the data value is f(x,y). The DCT produces a new 88 block (uv) of trans-formed data using the formula:
This results in an array of space frequency F(u,v) which gives the rate of change at a given point. These are normally 12-bit values which give a range of 0 to 4095. Each component specifies the degree to which the image changes over the sampled block. For example:
- F(0,0) gives the average value of the 8x8 array.
- F(1,0) gives the degree to which the values change slowly (low frequency).
- F(7,7) gives the degree to which the values change most quickly in both directions (high frequency).
Figure B2.8 Segment of an image in 8x8 pixel blocks
The coefficients are equivalent to representing changes of frequency within the data block. The value in the upper left block (0,0) is the DC or average value. The values to the right of a row have increasing horizontal frequency and the values to the bottom of a column have increasing vertical frequency. Many of the bands end up having zero or almost zero terms, which is useful when we compress long runs of zero values.
References
Ref: Garfinkel, Simson, Alex Nelson, Vassil Roussev and Douglas White, Using purpose-built functions and block hashes to enable small block and sub-file forensics, DFRWS 2010 Paper
Slides: Here
Sample Code
public string getJpeg(System.IO.Stream file) { string TextBox1 = ""; byte[] b = ReadFully(file, file.Length); TextBox1 = "Starting tag (should be FFD8): " + Global.intToHex(b[0]) + Global.intToHex(b[1]) + "<br/>"; TextBox1 += "APP0 marker (should be FFE0): " + Global.intToHex(b[2]) + Global.intToHex(b[3]) + "<br/>"; TextBox1 += "Length: " + Global.intToHex(b[4]) + Global.intToHex(b[5]) + "<br/>"; TextBox1 += "Identifier (should be JFIF): " + (char)b[6] + (char)b[7] + (char)b[8] + (char)b[9] + "<br/>"; TextBox1 += "Version (major): " + Global.intToHex(b[10]) + "<br/>"; TextBox1 += "Version (minor): " + Global.intToHex(b[11]) + "<br/>"; TextBox1 += "Density (0 - No units, 1 pixel per inch, 2 pixels per cm): " + Global.intToHex(b[12]) + "<br/>"; TextBox1 += "<h2>Detailed Analysis</h2>"; for (int i = 0; i < b.Length - 1; i++) { if (b[i] == 0xFF && b[i + 1] == 0xD8) TextBox1 += String.Format("Found FFD8 tag (Start of image). Pos: {0}\r\n", i); else if (b[i] == 0xFF && b[i + 1] == 0xE0) { TextBox1 += String.Format("Found FFE0 tag (JPEG file identifier). Pos: {0}<BR/>", i); int val = (b[i + 2] << 8) + b[i + 3]; TextBox1 += String.Format(" Length: {0}\r\n", val); } else if (b[i] == 0xFF && b[i + 1] == 0xC0) TextBox1 += String.Format("JPEG: Found FFC0 tag (Start Of Frame (Baseline DCT)). Pos: {0}, Segment: {1}<BR/>", i, (int)i / 512); else if (b[i] == 0xFF && b[i + 1] == 0xC2) TextBox1 += String.Format("JPEG: Found FFC2 tag (Start Of Frame (Progressive DCT)). Pos: {0}, Segment: {1}<BR/>", i, (int)i / 512); else if (b[i] == 0xFF && b[i + 1] == 0xC4) TextBox1 += String.Format("JPEG: Found FFC4 tag (Huffman Table). Pos: {0}, Segment: {1}<BR/>", i, (int)i / 512); else if (b[i] == 0xFF && b[i + 1] == 0xDB) TextBox1 += String.Format("JPEG: Found FFDB tag (Quantization Table). Pos: {0}, Segment: {1}<BR/>", i, (int)i / 512); else if (b[i] == 0xFF && b[i + 1] == 0xDD) TextBox1 += String.Format("JPEG: Found FFC2 tag (Define Restart Interval). Pos: {0}, Segment: {1}<BR/>", i, (int)i / 512); else if (b[i] == 0xFF && b[i + 1] == 0xDA) TextBox1 += String.Format("JPEG: Found FFDA tag (Start Of Scan). Pos: {0}, Segment: {1}<BR/>", i, (int)i / 512); else if (b[i] == 0xFF && b[i + 1] == 0xFE) TextBox1 += String.Format("JPEG: Found FFDE tag (Comment). Pos: {0}, Segment: {1}<BR/>", i, (int)i / 512); else if (b[i] == 0xFF && b[i + 1] == 0xD9) TextBox1 += String.Format("JPEG: Found FFD9 tag (End of image). Pos: {0}, Segment: {1}<BR/>", i, (int)i / 512); else if (b[i] == 0xFF && b[i + 1] == 0x00) TextBox1 += String.Format("JPEG: Found FF00 stuffed FF (Likely Huffman Coding). Pos: {0}, Segment: {1}<BR/>", i, (int)i / 512); } file.Close(); return (TextBox1); }