The following is the code I got from Andres Hernandez [cybereality] for separating a .mpo file into 2 relative .jpeg files (left and right). The key point is to find the second jpeg’s header “FFD8FFE1” and this is my first time to touch jpeg’s header format. Kinda interesting.

According to Andres’s idea, we all hope everyone could keep sharing any informative stuff to help others’ work or research. And eventually, we could benefit from others’ great achievement :)

Cool, no problem man. It would be cool if you could upload the mac version on that same MTBS thread so it can help others. MTBS can host files, there is a small “browse for file” button under the post box, then click “add file”, so it is very easy to include files in a thread. I am sure there are other mac users that would appreciate it.

Source: Meant to be Seen .

// MPO2Stereo:
// Converts Fujifilm MPO format 3D
// images into JPEG stereo pairs
//
// code by: 
// Andres Hernandez [cybereality]

#include <iostream>
#include <fstream>

using namespace std;

int fileSize;
char * stereoData;
char * rightData;

int main( int argc, char* argv[] ){
	// title
	printf("\n*********** MPO2Stereo [cybereality] ***********\n");
	printf("------------------------------------------------\n");

	// print usage if no arguments
	if(argc == 1){
		printf("Converts MPO files to JPEG stereo pairs.\n");
		printf("Usage: MPO2Stereo.exe File_1.MPO [.. File_N.MPO]\n");
	}
	// loop through each argument
	for( int i = 1; i < argc; i++ ){
		// get the file name
		char fileName[255];
		char fullName[255];
		// locate end of path, which is the last slash in the string
		char *ptr = strrchr(argv[i],'/');
		// make sure its a directory
		if(ptr != NULL){
			// copy remainder of string
			strcpy(fileName,ptr+1);
			// remember full name
			strcpy(fullName, fileName);
			// check if its an MPO file
			char *MPO = strstr(fileName, ".MPO");
			char *mpo = strstr(fileName, ".mpo");
			// strip file extension
			ptr = strchr(fileName,'.');
			// if the extension exists, truncate it
			if(ptr != 0) *ptr = 0;
			// make sure its an MPO file
			if(MPO == NULL && mpo == NULL){
				printf("Cannot Process: \"%s\". Not An MPO File.\n", fullName);
				// go to next file if any
				continue;
			} else {
				// print file name
				printf("Processing MPO File: \"%s\"...\n", fullName);
			}
		} else {
			// malformed directory
			printf("Invalid Directory For File: %s\n", argv[i]);
			printf("Must Include Full Directory Path To MPO File.\n");
			// skip
			continue;
		}

		// load up the MPO file
		ifstream mpoFile (argv[i], ios::in|ios::binary|ios::ate);
		// make sure we can open file
		if (mpoFile.is_open()) {
			// read the image data into a buffer
			fileSize = (int)mpoFile.tellg();
			stereoData = new char [fileSize];
			mpoFile.seekg (0, ios::beg);
			mpoFile.read (stereoData, fileSize);
			mpoFile.close();

			// start of the next image
			char startOfImage [8]= { 'F', 'F', 'D', '8', 'F', 'F', 'E', '1' };
			int imageBreak;

			// find the break point between the image pairs
			for(int i=0; i < fileSize; i+=4){
				// get block into a c string
				char block[255];
				// extract the characters
				sprintf(block, "%.2X%.2X%.2X%.2X", 
				(unsigned int)(unsigned char)stereoData[i], 
				(unsigned int)(unsigned char)stereoData[i+1], 
				(unsigned int)(unsigned char)stereoData[i+2], 
				(unsigned int)(unsigned char)stereoData[i+3]);
				// check for start of image
				if(strncmp(block, startOfImage, 8) == 0){
					// remember where the image starts
					imageBreak = i;
					cout << imageBreak << endl;
				}
			}

			// write left image to new file
			char leftName[255];
			sprintf(leftName, "%s_L.JPG", fileName);
			ofstream leftFile;
			leftFile.open (leftName, ios::out | ios::binary);
			if (leftFile.is_open()) {
				leftFile.write (stereoData, imageBreak);
				leftFile.close();
				printf("Created JPEG File: \"%s\".\n", leftName);
			} else {
				printf("Unable To Create JPEG File: \"%s\".\n", leftName);
			}
			// write right image to new file
			char rightName[255];
			sprintf(rightName, "%s_R.JPG", fileName);
			ofstream rightFile;
			rightFile.open (rightName, ios::out | ios::binary);
			if (rightFile.is_open()) {
				rightFile.write (stereoData + imageBreak, fileSize-imageBreak);
				rightFile.close();
				printf("Created JPEG File: \"%s\".\n", rightName);
			} else {
				printf("Unable To Create JPEG File: \"%s\".\n", rightName);
			}
			// delete resources
			delete[] stereoData;
		} else {
			printf("Unable To Open MPO File.\n");
		}
	}
	// all done
	printf("------------------------------------------------\n");

	// return
	return 0;
}