CrypoPunk Aesthetics
Punks on the grid, by gender
he CryptoPunks have become totems for crypto art and NFTs, preceding the Ethereum ERC-721 Non-Fungible Token standard that gave the medium its name by a year. Created as an experiment, they work as art by embracing their chosen medium's affordances, limitations, and resonances. I'll talk about that another time, but here I want to talk about their visual composition.
Christies make the case for the CryptoPunks well: https://www.christies.com/en/stories/10-things-to-know-about-cryptopunks-94347afeea234209a7739c240149f769
Note that they lead with the basics of the Punk picture plane: 28x28 pixels (a 28x28 grid) in 8-bit colour (a 256 colour palette, indexing into a wider 24-bit colour space). You can read more about those dimensions here: https://medium.com/web-design-web-developer-magazine/what-dimensions-should-pixelated-nfts-be-7b3dce5ac10f (account required to read)
Each CryptoPunk is composed on this grid from a set of discrete elements, recorded in their metadata as their attributes. The CryptoPunks popularized granular trading card-style rarity tiers and attributes outside of gaming collectibles: https://www.cryptopunks.app/cryptopunks/attributes
A dataset of all the attributes can be found here: https://github.com/cryptopunksnotdead/punks.attributes
(Some punks have attributes that cannot be seen due to the layering of those attributes under others that hide them: https://madebypunks.co/p/punk-secrets )
The expansionpunks project reverse engineered the composition of the punks from their elements:
https://medium.com/geekculture/expansionpunks-welcome-to-the-more-inclusive-punkverse-aa77e675bcf5
Note the way that gender, race, facial features, and the inclusion of non-human CryptoPunks like aliens and zombies is handled.
It is the aesthetics of the 24x24 cell (25x25 line) grid and its gendering that interests me here. Using a top-left origin as befits PNG and SVG images, and 1-indexed rows and columns the rows of the grid are divided as follows:
Region Male Female
Negative space and hair 1..5 1..6
Forehead 6..9 7..9
Eyes 10 10
Cheeks and nose 11..13 11..13
Mouth and lips 14..15 14..15
Chin and jawline 18 17
Neck and shoulders 19..24 18..24 And the columns:
Region Male Female
Face width 7..17 (11 px) 8..16 (9 px)
Forehead 7..17 8..16
Left ear (viewer's left) 17 16
Left eye (viewer's right) 9..10 9..10
Right eye (viewer's right) 13..14 13..14
Nose 11..12 11.12
Lips and mouth 11..14 11..13
Jawline and chin base 8..16 9..15Which gives us the following bounding boxes (in handy JSON format if anyone wants to use them for anything, but don't forget to subtract 1 when needed):
{
"templates": {
"male": {
"canvas": { "w": 24, "h": 24 },
"features": {
"face_bounds": { "x": 7, "y": 6, "w": 11, "h": 13 },
"forehead": { "x": 7, "y": 6, "w": 11, "h": 3 },
"left_eye": { "x": 9, "y": 10, "w": 2, "h": 1 },
"right_eye": { "x": 13, "y": 10, "w": 2, "h": 1 },
"visible_ear_left": null,
"visible_ear_right": { "x": 17, "y": 11, "w": 1, "h": 2 },
"nose": { "x": 11, "y": 12, "w": 2, "h": 1 },
"mouth": { "x": 11, "y": 14, "w": 4, "h": 2 },
"chin_base": { "x": 8, "y": 18, "w": 9, "h": 1 }
}
},
"female": {
"canvas": { "w": 24, "h": 24 },
"features": {
"face_bounds": { "x": 8, "y": 7, "w": 9, "h": 11 },
"forehead": { "x": 8, "y": 7, "w": 9, "h": 2 },
"left_eye": { "x": 9, "y": 10, "w": 2, "h": 1 },
"right_eye": { "x": 13, "y": 10, "w": 2, "h": 1 },
"visible_ear_left": null,
"visible_ear_right": { "x": 16, "y": 11, "w": 1, "h": 2 },
"nose": { "x": 11, "y": 12, "w": 2, "h": 1 },
"mouth": { "x": 11, "y": 14, "w": 3, "h": 2 },
"chin_base": { "x": 9, "y": 17, "w": 7, "h": 1 }
}
}
}
}
Accessories and other elements are positioned on the male grid. To position them correctly on the female grid, they are transformed where appropriate:
Or, less fancily, as Python, with the "base" values being the ones from the JSON:
def get_shifted_coordinates(archetype, anchor, x_base, y_base, w_base, h_base):
is_female = archetype == "female"
# Calculate dimensional offsets using linear logical conditions
x_shift = -1 if (is_female and anchor in ["ear", "mouth_corner", "jaw"]) else 0
y_shift_down = 1 if (is_female and anchor in ["hair", "headwear"]) else 0
y_shift_up = -1 if (is_female and anchor in ["jaw", "neck"]) else 0
# Compute the final pixel-grid layout dimensions
return {
"x": x_base + x_shift,
"y": y_base + y_shift_down + y_shift_up,
"w": w_base - (2 if (is_female and anchor == "jaw") else 0),
"h": h_base - (1 if (is_female and anchor == "jaw") else 0)
}There are male, female, and unisex accessories/elements.
Shared elements are positioned correctly on the male and female layouts on the grid by the above algorithm:
- Eyewear: 3D Glasses, Big Shades, Classic Shades, Eye Patch, Horn-Rimmed Glasses, Nerd Glasses, Regular Shades, Small Shades, VR, Welding Goggles.
- Asymmetric Additions: Cigarette, Earring, Pipe, Vape.
- Facial Details: Clown Nose, Medical Mask, Mole, Rosy Cheeks, Spots.
- Overlapping Hair/Hats: Bandana, Cap, Cowboy Hat, Fedora, Headband, Knitted Cap, Mohawk, Mohawk Dark, Mohawk Thin, Top Hat.
Male attributes are aligned to the male layout on the grid:
- Beards & Facial Hair: Big Beard, Chinstrap, Front Beard, Front Beard Dark, Goat, Handlebar, Luxurious Beard, Mustache, Muttonchops, Normal Beard, Normal Beard Dark, Shadow Beard.
- Male Exclusive Headwear: Beanie, Do-rag, Hoodie, Peak Spike, Pilot Helmet, Police Cap.
- Male Exclusive Hair Styles: Clenched Teeth, Crazy Hair, Frown, Haircut, Messy Hair, Shaved Head, Smile, Stringy Hair, Vampire Hair, Wild Hair.
Female attributes are aligned to the female layout on the grid:
- Cosmetics: Black Lipstick, Hot Lipstick, Purple Lipstick.
- Female Exclusive Jewelry: Choker, Gold Chain.
- Female Exclusive Hair Styles: Blonde Bob, Blonde Short, Dark Hair, Half Shaved, Orange Side, Pigtails, Pink With Hat, Purple Hair, Red Mohawk, Straight Hair Dark, Straight Hair Blonde, Straight Hair, Tassel Earrings, Tiara, Wild Blonde, Wild White Hair.
I'm not trying to extract a theory of anything here, just to break down the compositional layout of the CryptoPunks and get a good understanding of how elements are sized and positioned within it.
(Cover image "Punk Cryptos (Sketch 1)", AI generated by leonardo.ai .)
Did you enjoy this article?
Recommend it — Standard Reader surfaces well-loved writing to more readers across the network.