Return to Digital Photography Articles
JPEGsnoop 1.7.3 - JPEG File Decoding Utility
by Calvin Hass © 2014
JPEGsnoop is a free Windows application that examines and decodes the inner details of JPEG and MotionJPEG AVI files. It can also be used to analyze the source of an image to test its authenticity.
Overview
Latest Version: 1.7.3
Introduction
Every digital photo contains a wealth of hidden information -- JPEGsnoop was written to expose these details to those who are curious.
Not only can one determine the various settings that were used in the digital camera in taking the photo (EXIF metadata, IPTC), but one can also extract information that indicates the quality and nature of the JPEG image compression used by the camera in saving the file. Each digical cameras specifies a compression quality levels, many of them wildly different, leading to the fact that some cameras produce far better JPEG images than others.
What can I do?
Check out a few of the many possible uses for JPEGsnoop!
One of the latest features in JPEGsnoop is an internal database that compares an image against a large number of compression signatures. JPEGsnoop reports what digital camera or software was likely used to generate the image. This is extremely useful in determining whether or not a photo has been edited / tampered in any way. If the compression signature matches Photoshop, then you can be pretty sure that the photo is no longer an original! This type of analysis is sometimes referred to as Digital Image Ballistics / Forensics.
JPEGsnoop reports a huge amount of information, including: quantization table matrix (chrominance and luminance), chroma subsampling, estimates JPEG Quality setting, JPEG resolution settings, Huffman tables, EXIF metadata, Makernotes, RGB histograms, etc. Most of the JPEG JFIF markers are reported. In addition, you can enable a full huffman VLC decode, which will help those who are learning about JPEG compression and those who are writing a JPEG decoder.
Other potential uses: determine quality setting used in Photoshop Save As or Save for Web settings, increasing your scanner quality, locating recoverable images / videos, decoding AVI files, examining .THM files, JPEG EXIF thumbnails, extract embedded images in Adobe PDF documents, etc.
Trying to Undelete or Unformat your Photos?
If you're interested in trying to recover your deleted / corrupted photos, check out my new page on recovering deleted photos.
File Types Supported
JPEGsnoop will open and attempt to decode any file that contains an embedded JPEG image, such as:
- .JPG - JPEG Still Photo
- .THM - Thumbnail for RAW Photo / Movie Files
- .AVI* - AVI Movies
- .DNG - Digital Negative RAW Photo
- .PSD - Adobe Photoshop files
- .CRW, .CR2, .NEF, .ORF, .PEF - RAW Photo
- .MOV* - QuickTime Movies, QTVR (Virtual Reality / 360 Panoramic)
- .PDF - Adobe PDF Documents
* Note that video file formats (such as .AVI and .MOV) are containers, which can include video streams encoded in one of a wide variety of codecs. JPEGsnoop can only interpret this video footage if the codec used is based on Motion JPEG (MJPG).
Download the Latest Version of JPEGsnoop!
Click to Download .ZIP |
Version: 1.7.3 Version History Released: 09/28/2014 Downloads: 410344 |
JPEGsnoop by Calvin HassHelp Support JPEGsnoop DevelopmentIf you have found JPEGsnoop useful and would like to support its continued development, consider making a small contribution. Donations will help encourage me to add new and interesting features. Found an interesting use for the tool? Let me know! |
Source Code: JPEGsnoop is now Open Source!
System RequirementsThis application has been designed and tested to run on Windows XP, Windows Vista and Windows 7. As of version v1.7, Windows XP SP1 is a minimum requirement. JPEGsnoop is fully portable, so it does not require any installation! LINUX users: JPEGsnoop apparently works on LINUX under wine Mac users: JPEGsnoop works within CrossOver Mac Terms of UseJPEGsnoop is free for personal and commerial use. Commercial users are encouraged to leave me a brief private message so that I can understand your needs and make future versions more useful. |
InstallationNo installation required. JPEGsnoop is very portable. Simply unzip the download and run! Version HistoryFor information about features added in previous versions of JPEGsnoop, please check out the version history page. Feature Requests / Bug ReportsPlease feel free to add your own feature requests or bug reports by submitting to the links on the JPEGsnoop Source page |
Awards and Recognition for JPEGsnoop
|
![]()
|
|
| Main Window |
|---|
|
| Channel Histograms |
|
| MCU Grid & Positioning |
Documentation
Please see the options page for information on how to use JPEGsnoop and other interesting uses for the tool
Recent Features
- Photoshop PSD decoding
- Batch file processing
- XMP APP1 & ICC Header display
- IPTC and Photoshop IRB / 8BIM parsing
- GPS EXIF metadata display
- Full detailed Huffman VLC decoding output for those interested in writing a decoder or learning JPEG compression
- Automatic display of YCC DC block values (16-bit)
- MCU Grid overlay and automatic display of mouse MCU position and file offset in image display window.
- Test overlay function enhanced to allow quick apply and binary code readout.
- Image zoom level from 12.5% - 800%.
- Extract embedded JPEGs -- can be used to extract thumbnails, hidden JPEG files, as well as frames from Motion JPEG AVI files.
- Compression detection enhanced to detect rotated signatures, comment field.
- Full AVI file parsing (to identify MotionJPEG)
- DQT table searches in Executables (for "hackers")
- Detect edited images or identify original digital camera that took a photo!
- Integrated database of thousands of compression signatures (image fingerprint) for digital cameras and editing software
- File overlay test function
- Multi-channel preview: RGB, YCC, R/G/B, Y/Cb/Cr
- Pixel position lookup into file offset
- Examine Motion JPEG .AVI or .MOV (Quicktime) files (MJPG or MJPEG) and play through!
- Examine any file fragments that may contain a JPEG image
- YCC to RGB Color correction / clipping statistics reports
- Command-line execution
- Huffman variable-length code statistics
- Expansion of DHT (Huffman Table Expansion into bitstrings)
- Determine IJG JPEG Quality factor
Background Material
If you want to understand some of the technical details reported by JPEGsnoop, I suggest that you read through my articles on JPEG compression:
Suggestions
As this is a work in progress, I would be very interested in hearing from you, particularly for feature requests, suggestions, comments, bug reports, etc. If you currently use JPEGsnoop and find it useful, let me know!


Reader's Comments:
Please leave your comments or suggestions below!Many thanks for a most useful analytical tool. I'm happy to make a donation to further development. How much do you suggest?
I have one question about JPEGsnoop. I tested the software with an image captured using a friend's Apple iPod. EXIF metadata confirms this. However, the compression signature is for a Konica Minolta camera.. Is it probable that both the iPod and the Minolta both use the same compression algorithm?
Look forward to hearing from you.
What you have noted with the compression signature is exactly as you figured... for the particular image content and camera settings, both used the same compression table.
It is quite common to see a given table appear in multiple camera manufacturers... it could be that they reuse the same hardware image encoder or use the same library / reference tables. The notion of the compression signature being a "fingerprint" is a bit of a misnomer in that regard since there is considerable reuse.
If you don't see the Apple iPod in the list of matching signatures, then it would be best to add it (the result would be that you'll see both cameras listed as possible matches).
Hope that helps,
Cal
I'm trying to detect if a PDF has been photoshopped.
I have a base PDF to compare it to.
What parameters should I be looking at?
In this particular situation, could you clarify what you meant by the "base PDF" -- is it another PDF that should be identical to the second PDF (but you didn't notice any differences?) Sorry if I misunderstood the question.
If the PDF file was edited according to "spec", then it may leave some traces of edits (in a ModDate or generation numbers in the objects), but this isn't guaranteed.
If you are wondering about whether an embedded JPEG within a PDF file has been altered (since originally captured), then you can use the image search function in JPEGsnoop to find the image and then process it as normally (ie. compare compression signatures, etc.).
i would test the version 1.7.4
suggestion:
add parameter to save the file when use
-ext_all
through cmd
also some pictures not ext_all through nogui only when i open it normally
PNG files don't work with this tool right?
I have a microscope-camera gadget called an "EyeClops" (I think it came from Toys R Us) that's not in your ID database -- do you want an image to check out?
I am having a hard time understanding all the codes. If I sent you a photo would you be able to decipher? All I want to know is if the photo is an original? And possibly the region it was taken.
Thank you.
I am trying to use your program to recover some corrupted jpeg. Everytime I try to open the jpeg i get this error "The Parameter is in correct"
can you please help. Thank you
A couple sample images I am trying to recover can be found on my dropbox link at https://www.dropbox.com/sh/c4j0z5o3sy7exnb/AACXfEUOarN9iDu-hnIDsXTDa?dl=0
Great program! Just need to figure out how to get it to fully recover the hi-res versions.
Thanks in advance
Chris
*******************************************
Curious why when I export as JPEG it outputs a much smaller version of what the original image was. The original images are about 8MB in size while the output of snoop is only about 50 KB??
The reason for that is that most JPEG images (from a digicam) contain several versions of the same image. Generally you'll find a full-resolution image, a small thumbnail and sometimes a large thumbnail/preview. What you have encountered is probably a case where JPEGsnoop found the small thumbnail first (and extracted that). If you press "Search Forward" you might find that it could locate one of the larger images, thereby enabling you to extract that as well.
Were the 3 files you posted from the output of a recovery program or were they direct from your hard drive / memory card? These files all exhibit a case of the file being a merge of multiple photos.
Long story short, the original images have been "spliced" causing only a small amount of data to be extracted. More advanced techniques are needed to get at the remainder of the data (dealing with fragmentation). But even then. you would not be able to fully recover the hi-res version -- your original images do not exist within these files.
More detail: JPEGsnoop's image decode only starts when it finds a proper header. When you perform "Search Forward", JPEGsnoop will seek the next valid JPEG header. In doing so, it is skipping over a very large amount of data that is in the file. This extra data is actually the remainder of another image data from your drive/card. It is possible to see this additional image data if one messes around with the headers.
Let's say that the original image was 8.6MB in size. In example "_SCN0336.JPG" we actually skip almost 7MB before we find the start of a valid image. That only leaves us with 1.6MB of image data before we get cut off. If we try to extract the image, we are only left with a small fraction of the original file. The extra 7MB is coming from a completely different hi-res file that happened to be on the card/drive.
The DB is C:\Users\alfredo\AppData\Roaming\JPEGsnoop\JPEGsnoop_db.dat dimension 1 KByte.
Is there ANY way to recover these files?
Thank you in advance.
For example, in an iPhone 5 JPEG image, one often finds date/time info in the following sections reported by JPEGsnoop:
In addition, some recent iPhones (typically iOS 7 or later) include Apple MakerNotes fields that (after decoding) may show further date/time info. The advantage of checking MakerNotes is that it is often harder for software to alter these fields -- instead they tend to remove them all if anything is modified. As a result, if you find a date/time in the MakerNote field, there is a reasonable chance that it is reflective of the actual date/time of capture.
thanks ..
I might be stupid but I am having a problem with this program.
I click on file, It says, Open Image. which I click on. I go to my damaged pictures and click on one. I can then see a small thumbnail of the picture (no bigger than a stamp) Then open tools and click on Export jpeg. Send to my desktop. But then on my desktop there is no picture?? I have tried sending the pics to various locations with the same results. I have also tried different pictures all with the same result.
Please tell me where I am going wrong or what I am doing wrong.
Many Thanks.
Below that, it should give you the full path to your file after Exporting to:. Do you see this path? Copying this full path into a windows explorer window, it should find and load the image for you.
I just wanna ask if you know a software that can restore cropped photos
Into its original form that has been put into collage?
What I mean is, knowing and extracting and getting it to its original form.
I have sent a collage pics to a friend, all pics used were all cropped
and to my surprised she identified the people I'm with from that cropped
image in the collage. She said she restored it using the embedded details
in every picture.
I'm wondering how she do that.
Help pls.
Thanks
Please find posters about the Canon Raw (CR2) file format
https://github.com/lclevy/libcraw2/blob/master/docs/cr2_poster.pdf
https://github.com/lclevy/libcraw2/blob/master/docs/cr2_lossless.pdf
Laurent Clévy
@lorenzo2472
http://lclevy.free.fr/cr2
I wonder if jpeg-snoop is able to detect which jpeg image is corrupted. I have got about 10.000 jpegs and I cannot see each of them with my eyes... I'd like to have a list of what damaged, if any. Is it possible?
I have now extended JPEGsnoop v1.7.2 to support files up to 4GB in size! I am just completing testing and will release it shortly. Thanks for your patience.
The following image
http://www.berlininart.com/wp-content/uploads/2012/08/1330_Kim.jpg
gives following error with JPEGsnoop 1.7.0:
ERROR: SetDhtTables(comp=4, TblDC = 0 TblAC = 0) out of indexed range
It worked faultlessly with JPEGsnoop 1.6.1.
Thank you!
Thanks for providing the example file. The handling of table indices with CMYK files has been fixed in version v1.7.1, along with many other corrections. Version v1.7.1 will be posted very shortly.
http://www.w3.org/MarkUp/Test/xhtml-print/20050519/tests/jpeg444.jpg
This issue has been fixed in JPEGsnoop version v1.7.1
I would recommend that you split the 54GB file into 1GB chunks (keep the original) and then use JPEGsnoop with the "Image Search Forward" command to see if any images can be extracted.
There are many free utilities that will split large files. A quick search of google for "windows utility split file free" shows a few.
Good luck!
It's the only one to successfully fix my image. However, there doesn't appear to be a way to export the image from the program other than screenshoting it... I'd like to look at the fixed file's hex though. Is there anyway to export the fixed image, or to manually fix the image based off the data JPEGsnoop gives?
I'm not sure exactly what the program does in response to the error.
It's this type of error:
*** ERROR: @ [offset here], num_coeffs>64 [68]
*** ERROR: Bad scan data in MCU(2,10): Lum DC CSS(0,1) @ Offset 0x00002DC3.1
MCU located at pixel=(32,168)
I'm understand that there's an extra AC coefficient at the given location in the specified MCU, how do I do what the program does and remove it (w/ hex editor I'm guessing...)?
Thanks for your help, and this fantastic program!
ffmpeg -i my.avi -ss 00:00:10.000 -f image2 -vframes 1 -pix_fmt yuvj422 out.jpg
You can also try this:
https://trac.ffmpeg.org/raw-attachment/ticket/143/yuvj422.jpg
I think you have the knowledge and skills to point me in the right direction.
I have a custom Highlights Warning jpg target built in Photoshop that I would like to upload to my Nikon DSLR. Once uploaded this can be used to determine the exact tonal level at which the Highlights Warning starts to flash thereby indicating clipping.
The problem I am having is putting the CS jpg in the right format for the Nikon DSLR to accept it. I have tried copying, cutting, pasting and editing EXIF data, headers, thumbnails and previews from an original Nikon jpg (using tools like exiftool) but can't find the right approach. I was wondering if it would be possible to take an existing Nikon jpg and using the hex editor remove the Nikon jpg and replace it with the CS target jpg, leaving the original Nikon exif intact?
Any ideas or help would be greatly appreciated as I am running out of ideas and "skill sets".
posted on a blog from 2011 ...
Signature: 01191863A92FA362537A80411114BBC3
Signature (Rotated): 01D7D42C1C869993B7E598D7C109534B
File Offset: 0 bytes
Chroma subsampling: 2x2
EXIF Make/Model: NONE
EXIF Makernotes: NONE
EXIF Software: OK [Adobe Photoshop CS3 Macintosh]
I have run a photo gotten same ...
Signature: 01191863A92FA362537A80411114BBC3
Signature (Rotated): 01D7D42C1C869993B7E598D7C109534B
File Offset: 0 bytes
Chroma subsampling: 2x2
EXIF Make/Model: NONE
EXIF Makernotes: NONE
EXIF Software: NONE
**(slightly different ID on rotated)
...MYRESULTS...
ASSESSMENT: Class 1 - Image is processed/edited
Questions.
1. Since my signature line 1 matches the old posting from 2011, is mine also from same software..
2. Is there a database update available? or a way to combine or share user databases?
3. Does the rotated signature indicate it is different from the 2011 blog posting?
(blog url )
http://forum.nexoneu.com/archive/index.php?t-336514.html
I found that running the pictures through JPEGSnoop clicking Tools IMG Search FWD, then click Export JPEG then tick Missing EOI, then I save the JPG and the image size/resolution is restored, which is great but I have several thousand files to restore, as I am having to do each one individually it will take me a long time, I know JPEGSnoop has a batch process function but I cannot seem to find out how to get this to automate what I am trying to do, does anyone know how to use the batch process function so that I can restore the photos automatically without going through them one at a time.
Below is a video on what I am doing to restore the size of each photo
http://youtu.be/HHJhaNPr4bA
In the meantime, you might be able to workaround it in the following way:
Good luck!
Great tool. I have been experimenting with Google+/Picasaweb and trying to check that when I download files back to my PC, they haven't been compromised. I noticed that they are slightly smaller, and using your software I have been able to show that one of the thumbnails is missing from the file recovered from Google. That's fine, but it doesn't account for all the kb lost. If I export as a TIF, the resulting files are exactly the same size. Does this prove that my original has not been re-compressed? The 2 signatures are the same. The metadata seems to be the same, but I really just want to make sure it is the same image data in there.
Guy
I have used a number of EXIF utilities for my Android to find the date some pics were taken, but I cannot find this info on images that were texted to me or that I download. They all work on pictures taken on my own phone, but not those downloaded via text or the net. Any hints on that? Does yours manage to do this? If so, I will download but I have to find a PC to do so, since I am on a Mac, unless there is a version directly for Android that you have?
Thanks, John
This is a fantastic little tool, and you don't even charge people for it - brilliant! Unfortunately, this dumped out some sort of protection fault here on Linux. I hope you have some of your friends around with a Linux box. It appears to trigger much likely if you SCROLL quickly up and down in the GUI.
http://pastebin.com/wGkzaBEn
I hope this will make any sense to you.
To reduce the clutter: first part is output from console, then after ' ... ' there is the second part copypasted from the error message window.
"You may have run into a bug in Wine's RICHED20.DLL. You can try using Microsoft's RICHED20.DLL by running winetricks and selecting riched20. This may let you work around the problem until the Wine developers fix the bug."
Thank you!
I was able save the first two I tried. Maybe I should fork out a few bucks for this handy little program...
I never could get windows7 to open a jpeg with separate scan data sections for each image component (Alex posted an example image in a comment here from may 2011).
My solution was to used jpegtran, available for free nearly unrestricted use, to "optimize" the jpeg without re-encoding and in the process it combines the 3 scan data sections to 1 which makes windows happy.
Thanks again for the great site, i never would have looked for a lossless jpeg optimizer if I hadn't realized that such a thing was possible from reading over your site.
A bonus is the optimized images are combing back about 10% smaller in file size!
Was hoping you could tell me something about images with 3 scan data sections, each with one component of a 3 component image (one Y scan data section and another for each of CR and CB).
I have some images like that that the windows imaging components in windows 7 don't like (so cant open in image viewer, internet explorer, .net programs).
In my case if I isolate any of the 3 sections, (deleting the other 2 with a hex editor) that component will show fine ... but with the 3 together, or some combinations of 2, windows thinks the file is corrupt.
I appreciate that you can't help everyone fix their corrupt jpegs but any insights in the 3 scan images might help me out, thanks a lot
Please, let me know if you can send me these two functions and how much you will charge to do that.
Thank you for your help. Mauro Pacelli
I have recovered thousands of pictures from my hard drive and they are all not working, JPEGsnoop has saved my life but is there an option to export many JPEG's at one time? I can process the batch but just don't know how to export them all at once. Could you help please?
Thanks, Matt
How can I tell WHERE a photo was taken? I understood that the GPS in many cameras will give the location.
Thanks!
Thanks for this great tool!
I have a question about the EXIF decodng in JPEGSnoop. Specifically, I'm trying to figure out why it says the file in question has an "EXIF IFD2" IFD.
http://www.smalleranimals.com/isource/exifouttest.jpg (2K)
As far as I can tell, it doesn't. I've parsed it with our EXIF parser, ImgSource (http://www.smalleranimals.com/isource.htm) . And I've walked through the bytes manually. But I don't see why JPEGsnoop finding that IFD. I can see the data that it _thinks_ is the IFD, but I don't know how or why JPEGsnoop is getting there.
We use JPEGsnoop as a sanity check for our own EXIF processing as well as for JPEG structural analysis, so if there's a bug in our stuff, I'd like to know. And if there's a bug in JPEGsnoop, I assume you'd like to know.
Can you shine any light on this?
[JPEGsnoop output trimmed]
Start Offset: 0x00000000 *** Marker: SOI (xFFD8) *** OFFSET: 0x00000000 *** Marker: APP0 (xFFE0) *** OFFSET: 0x00000002 ... trim ... *** Marker: APP1 (xFFE1) *** OFFSET: 0x00000014 ... trim ... EXIF IFD0 @ Absolute 0x00000026 Dir Length = 0x0009 ... trim ... Offset to Next IFD = 0x000002C3 EXIF IFD1 @ Absolute 0x000002E1 Dir Length = 0x0006 ... trim ... Offset to Next IFD = 0x00000048 EXIF IFD2 @ Absolute 0x00000066 Dir Length = 0x0003 Offset to Next IFD = 0x00020131 EXIF SubIFD @ Absolute 0x000000F6 Dir Length = 0x001B ... trim ...I had a quick look (thanks to baby!) at the file and it appears that the "Offset to Next IFD" at the end of the IFD1 is non-zero (0x48). This is prompting us to advance on to parse another IFD (which auto-increments to IFD2). Is it possible that the "Offset to Next IFD" might be set incorrectly?
I also double-checked this with exiftool. It seems that the exiftool parser also reports that we start processing IFD2.
Hope that helps! Let me know if you want me to debug it further, Cal.
NOTE: Image repair requests are not accepted. Thanks for your understanding.