JPG Information





/* 
DESCRIPTION:  Extracts any information after the actual end of a JPEG file.
*/

#include 
#include 
#include 
using namespace std;

unsigned long int szFile;
char * buffer;

int main(int argc, char* argv[])
{
    char *buffer;
    int dataBegin;
    char SOI[] = { 0xFF, 0xD8 }; //Start of Image
    char COMM[] = { 0xFF, 0xFE }; //Comments Follow
    char EOI[] = { 0xFF, 0xD9 }; //End of Image
    ifstream fin;
    ofstream fout;
    if(argc != 3 ) {
        cout << "Usage: " << argv[0] << " file.jpg outputfile.ext" << endl;
        exit(EXIT_SUCCESS);
    }

    fin.open(argv[1], ios::binary | ios::in | ios::ate);
    if(!fin.is_open()) {
        cerr << "Error while opening input file!" << endl;
        exit(EXIT_FAILURE);
    }
    szFile = (unsigned long int) fin.tellg();
    if(szFile < 4) {
        cerr << "Not a valid jpg image file!" << endl;
        exit(EXIT_SUCCESS);
    }
    
    buffer = new char[szFile];
    fin.seekg (0, ios::beg);
    fin.read (buffer, szFile);
    fin.close();
    
    if(buffer[0] != (char) 0xFF || buffer[1] != (char) 0xD8) {
        cerr << "Not a valid jpeg image file!" << endl;
        exit(EXIT_SUCCESS);
    }
    
    bool comments = false;
    for(unsigned long int i = 2; i < szFile-1; i++) {
        if(buffer[i] == COMM[0] && buffer[i+1] == COMM[1]) {
            cout << "Jpeg Comments: "; comments = true;
        }

        if(buffer[i] == EOI[0] && buffer[i+1] == EOI[1]) {
            if(comments){
                //end comments section;
                comments=false;
                cout << endl;
            }
            cout << "Jpeg Image Size: " << i+1 << " bytes" << endl;
            dataBegin = i + 2;
            break;
        }
        if(comments) cout << (char)buffer[i];
    }

    fout.open(argv[2], ios::out | ios::binary);
    if(!fout.is_open()) {
        cerr << "Error while opening output file!" << endl;
        exit(EXIT_FAILURE);
    }
    for(unsigned long int i = dataBegin; i < szFile; i++) {
        fout.put(buffer[i]);
    }
    fout.close();
    cout << "Done Writing " << szFile - dataBegin << " bytes to " << argv[2] << endl;

    delete[] buffer;
    exit(EXIT_SUCCESS);
}