32K Sistine Chapel CubeMap [Python How-To]
The Vatican recently put up an interactive Sistine Chapel flash application. You can pan around the entire room and zoom in and out in great detail.
The Vatican is not very open with it’s art, the reason they scream ‘NO PHOTO’ when you pull a camera out in the chapel is that they sold the ability to take photos of it to a Japanese TV Station (Nippon TV) for 4.2 million dollars. Because the ceiling has long been in the public domain, the only way they can sell ‘the right to photograph’ the ceiling is by screwing over us tourists who visit. If you take a photo, they have no control over that image –because they don’t own the copyright of the work.
Many of you who know me, know I am a huge fan of Michelangelo’s work, this data was just too awesomely tempting and when I saw it posted publicly online, I really wanted to get my hands on the original assets.
Here is a python script to grab all of the image tiles that the flash app reads, and then generate the 8k faces of the cubemap. In the end you will have a 32,000 pixel cubemap.
First we copy the swatches from the website:
def getSistineCubemap(saveLoc): import urllib #define the faces of the cubemap, using their own lettering scheme faces = ['f','b','u','d','l','r'] #location of the images url = 'http://www.vatican.va/various/cappelle/sistina_vr/Sistine-Chapel.tiles/l3_' #copy all the swatches to your local drive for face in faces: for x in range(1,9): for y in range(1,9): file = (face + '_' + str(y) + '_' + str(x) + '.jpg') urllib.urlretrieve((url + face + '_' + str(y) + '_' + str(x) + '.jpg'), (saveLoc + file)) urllib.urlcleanup() print "saved " + file |
Next we use PIL to stitch them together:
def stitchCubeMapFace(theImage, x, y, show): from PIL import Image, ImageDraw from os import path file = theImage.split('/')[-1] fileSplit = file.split('_') im = Image.open(theImage) #create an 8k face from the first swatch im = im.resize((8000, 8000), Image.NEAREST) thePath = path.split(theImage)[0] xPixel = 0 yPixel = 0 #loop through the swatches, stitching them together for y_ in range(1, x+1): for x_ in range(1,y+1): if yPixel == 8000: yPixel = 0 nextImage = (thePath + '/' + fileSplit[0] + '_' + str(x_) + '_' + str(y_) + '.jpg') print ('Merging ' + nextImage + ' @' + str(xPixel) + ',' + str(yPixel)) loadImage = Image.open(nextImage) im.paste(loadImage, (xPixel, yPixel)) yPixel += 1000 xPixel += 1000 saveImageFile = (thePath + '/' + fileSplit[0] + '_face.jpg') print ('Saving face: ' + saveImageFile) #save the image im.save(saveImageFile, 'JPEG') #load the image in default image viewer for checking if show == True: import webbrowser webbrowser.open(saveImageFile) |
Here is an example of the input params:
getSistineCubemap('D:/sistineCubeMap/') stitchCubeMapFace('D:/sistineCubeMap/r_1_1.jpg', 8, 8, True) |