Een stereo image kan een .mpo bestand zijn. Dat zijn gewoon twee of meer afbeeldingen in een enkel bestand. Dit werd ook gebruikt op de 3DS.
Online .MPOs voor oefenen.
FileFormatSamples
Op Sembiance staan nog wat .mpo bestanden gearchiveerd. Die zijn hier te vinden.
3ds library
Mocht je willen oefenen met het parsen van .mpo bestanden, of een dataset willen opbouwen, staat op deze publiek toegankelijke drive een grote set aan afbeeldingen.
Warning
Ik heb deze set gevonden met de🔸digger. Ik heb geen bewijs van toestemming en wil dus benadrukken dat deze foto’s niet gedistribueerd mogen worden.
Mocht je perse met .mpo willen werken raad ik je aan ze zelf samen te stellen door gemaakte afbeeldingen met je stereo camera. Voor het verbinden met je camera heb ik instructies geschreven voor PoE cameras en Usb-C cameras.
Het uitlezen van .MPO bestanden in code
Niemand heeft tijd en zin om nieuwe code te schrijven om .mpo bestanden te ondersteunen. Daarom heb ik dit al voor je gedaan! 😙
Python
Voor Python heb ik een methode gemaakt die van een Path van een .mpo afbeelding een lijst teruggeeft van Image instanties uit PIL.
import pathlib
from typing import List
from PIL import Image
# Based on this https://github.com/tribut/mposplit/tree/master beautifully WTFPL licensed script.
def parse_mpo_file(path: pathlib.Path) -> List[Image] | None:
path = path.resolve()
try:
image = Image.open(path)
except IOError as e:
print('Could not read image: {}'.format(e))
return None
if image.format != 'MPO':
print('Format ' + image.format +
' not recognized as MPO, this script may not work')
images_list = []
try:
position = 0
while True:
image.seek(position)
filename = '{}-{}{}'.format(path.stem, position, path.suffix)
fullname = path.parent.joinpath(filename)
if fullname.exists():
print('{} already exists - skipping.'.format(filename))
else:
print('Extracting image to {}'.format(filename))
try:
# image.save(fullname)
images_list.append(image)
except IOError as e:
print(' Could not# Only used on load, thus does never need to be validated again. save: {}'.format(e))
position = image.tell() + 1
except EOFError:
return images_list # All images processed
Andere programmeertalen
Ongetest!
Dit overzichtje bevat libraries die aldus documentatie .mpo bestanden kan uitlezen. Ik heb alleen met Python gewerkt voor dit onderdeel, dus ik heb deze libraries nooit getest.
Het schrijven van .MPO bestanden in code
Door middel van Pillow is het erg makkelijk om .MPO bestanden te schrijven in Python. Ik had in mijn eigen applicatie een methode geschreven om gelijk twee mappen samen te voegen:
class MPOMerger:
def __init__(self, logger: ILogger):
self.logger = logger
def merge_folders(self, export_dir: Path, left_dir: Path, right_dir: Path):
"""Assumes left and right dir children file names are equal. Will skip entries that are not in both."""
# TODO: Check if image is actually image.
# TODO: Check if all dirs exist.
for image in left_dir.iterdir():
left_image = image
right_image = right_dir / image.name
if right_image.exists():
self.merge(export_dir / (image.stem + ".mpo"), left_image, right_image)
def merge(self, export_path: Path, img_path_1: Path, img_path_2: Path):
"""Merges two images into a single .mpo image."""
# TODO: Check if image is actually image.
from PIL import Image
im1 = Image.open(img_path_1)
im2 = Image.open(img_path_2)
im1.save(export_path, save_all=True, append_images=[im2], format='MPO')
self.logger.info(f"Saved new mpo file to {export_path}")
Andere programmeertalen
Ongetest!
Dit overzichtje bevat libraries die aldus documentatie .mpo bestanden kan schrijven. Ik heb alleen met Python gewerkt voor dit onderdeel, dus ik heb deze libraries nooit getest.
.MPO Plugins voor externe software
Ongetest!
Dit overzichtje bevat plugins die aldus documentatie .mpo bestanden utiliseren. Ik heb deze libraries nooit getest.
Tijdens het onderzoek kwam ik ook plugins tegen voor verschillende software die van pas kan komen. Hieronder een overzicht:
In Adobe Photoshop kan je geen .mpo bestanden meer openen. Het lijkt alsof dit alleen kon in Photoshop 13 Beta.