We recently added a method to our Collection API which allows you to get any object’s “Albers” color codes. This is a pretty straightforward method where you pass the API an object ID, and it returns to you a triple of color values in hex format.
As an experiment, I thought it would be fun to write a short script which uses our API to grab a random object, grab its Albers colors, and then use that info to build an Albers inspired image. So here goes.
For this project I chose to work in Python as I already have some experience with it, and I know it has a decent imaging library. I started by using pycurl to authenticate with our API storing the result in a buffer and then using simplejson to parse the results. This first step grabs a random object using the getRandom API method.
api_token = 'YOUR-COOPER-HEWITT-TOKEN' buf = cStringIO.StringIO() c = pycurl.Curl() c.setopt(c.URL, 'https://api.collection.cooperhewitt.org/rest') d = {'method':'cooperhewitt.objects.getRandom','access_token':api_token} c.setopt(c.WRITEFUNCTION, buf.write) c.setopt(c.POSTFIELDS, urllib.urlencode(d) ) c.perform() random = json.loads(buf.getvalue()) buf.reset() buf.truncate() object_id = random.get('object', []) object_id = object_id.get('id', []) print object_id
I then use the object ID I got back to ask for the Albers color codes. The getAlbers API method returns the hex color value and ID number for each “ring.” This is kind of interesting because not only do I know the color value, but I know what it refers to in our collection ( period_id, type_id, and department_id ).
d = {'method':'cooperhewitt.objects.getAlbers','id':object_id ,'access_token':api_token} c.setopt(c.POSTFIELDS, urllib.urlencode(d) ) c.perform() albers = json.loads(buf.getvalue()) rings = albers.get('rings',[]) ring1color = rings[0]['hex_color'] ring2color = rings[1]['hex_color'] ring3color = rings[2]['hex_color'] print ring1color, ring2color, ring3color buf.close()
Now that I have the ring colors I can build my image. To do this, I chose to follow the same pattern of concentric rings that Aaron talks about in this post, introducing the Albers images as a visual language on our collections website. However, to make things a little interesting, I chose to add some randomness to the the size and position of each ring. Building the image in python was pretty easy using the ImageDraw module
size = (1000,1000) im = Image.new('RGB', size, ring1color) draw = ImageDraw.Draw(im) ring2coordinates = ( randint(50,100), randint(50,100) , randint(900, 950), randint(900,950)) print ring2coordinates ring3coordinates = ( randint(ring2coordinates[0]+50, ring2coordinates[0]+100) , randint(ring2coordinates[1]+50, ring2coordinates[1]+100) , randint(ring2coordinates[2]-200, ring2coordinates[2]-50) , randint(ring2coordinates[3]-200, ring2coordinates[3]-50) ) print ring3coordinates draw.rectangle(ring2coordinates, fill=ring2color) draw.rectangle(ring3coordinates, fill=ring3color) del draw im.save('file.png', 'PNG')
The result are images that look like the one below, saved to my local disk. If you’d like to grab a copy of the full working python script for this, please check out this Gist.
So, what can you humanities hackers do with it?
I made a Javascript version of your square generator; view source for best effect.
http://www.somebits.com/random-cooper-hewitt/
ah, very nice! I’m really curious to see what people do with our API. In my mind the Albers method ( or really the concept itself ) makes me think of all kinds of ways to visualize our collection. Thanks for taking a stab!
I’m struggling to imagine Josef Albers’ reaction to reading this post.