{"id":21585412,"url":"https://github.com/cryptopunksnotdead/punks.starter","last_synced_at":"2025-05-10T20:22:59.980Z","repository":{"id":53778551,"uuid":"122759478","full_name":"cryptopunksnotdead/punks.starter","owner":"cryptopunksnotdead","description":"DIY (Do-It-Yourself) - Yes, You Can!  Pixel Art Collection Quick Starter - Generate Algorithmically Your Own Curated (or Randomized) Collection","archived":false,"fork":false,"pushed_at":"2022-06-08T08:55:09.000Z","size":326,"stargazers_count":197,"open_issues_count":0,"forks_count":38,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-29T20:49:36.913Z","etag":null,"topics":["24px","24x24","cryptopunks","pixelart","punkverse"],"latest_commit_sha":null,"homepage":"https://cryptopunksnotdead.github.io","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cryptopunksnotdead.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-02-24T16:50:12.000Z","updated_at":"2025-04-14T17:49:36.000Z","dependencies_parsed_at":"2022-09-10T03:53:20.697Z","dependency_job_id":null,"html_url":"https://github.com/cryptopunksnotdead/punks.starter","commit_stats":null,"previous_names":["s6ruby/enums"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptopunksnotdead%2Fpunks.starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptopunksnotdead%2Fpunks.starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptopunksnotdead%2Fpunks.starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptopunksnotdead%2Fpunks.starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cryptopunksnotdead","download_url":"https://codeload.github.com/cryptopunksnotdead/punks.starter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253273103,"owners_count":21881963,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["24px","24x24","cryptopunks","pixelart","punkverse"],"created_at":"2024-11-24T15:10:35.751Z","updated_at":"2025-05-09T15:01:42.172Z","avatar_url":"https://github.com/cryptopunksnotdead.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\nNote: See [**/punks.whitelabel**](https://github.com/cryptopunksnotdead/punks.whitelabel) - \nThe Free White Label Punk Quick Starter Edition - if you want to (re)create from zero / scratch a pixel-perfect copy of the Matt \u0026 John's® 10 000 punks collection (anno 2017).\n\n---\n\n# Pixel Art Collection Quick Starter - Generate Algorithmically Your Own Curated (or Randomized) Collection\n\n\nTable of Contents / Sample Collections\n\n[**Collection №1 -  Twenty-Five Dodge Pixel Art Punks**](#collection-1----twenty-five-dodge-pixel-art-punks)  \u003cbr\u003e ![](i/no1/punks.png)\n\n[**Collection №2 -  The First One Hundred Pixel Art Punks**](#collection-2----the-first-one-hundred-pixel-art-punks)  \u003cbr\u003e ![](i/no2/punks.png)\n\n[**Collection №3 -  The First One Hundred Pixel Art Punks - The Black \u0026 White (Pencil Drawing) Sketch Edition**](#collection-3----the-first-one-hundred-pixel-art-punks---the-black--white-pencil-drawing-sketch-edition)  \u003cbr\u003e ![](i/no3/punks.png)\n\n[**Collection №4 - 111 Cool Blue Aliens (Incl. Females \u0026 Super-Rare Apes)**](#collection-4---111-cool-blue-aliens-incl-females--super-rare-apes)  \u003cbr\u003e ![](i/no4/punks.png)\n\n\n---\n\n\n\nLet's start and generate algorithmically a pixel art collection in three steps:\n\nStep 1 - Generate A List of Your Pixel Art Collection in a Tabular Text Format (Spreadsheet)\n\nStep 2 - Generate All Pixel Art Images in Original Format and In 20x\n\nStep 3 - Bonus: Generate an All-In-One Composite Image\n\n\n## Collection №1 -  Twenty-Five Dodge Pixel Art Punks\n\nLet's start with an exclusive twenty-five Shiba Inu dogs\npixel art collection. Much wow. Super rare.\n\nLet's copy and (re)use all punk (building) blocks\nin the dodge series (24×24):\n\nClassic ![](dodge/classic.png),\nDark ![](dodge/dark.png),\nZombie ![](dodge/zombie.png),\nAlien ![](dodge/alien.png)\n\n\u003c!-- note:\n  sort attributes a-z for now - why? why not?\n--\u003e\n\nAttributes (by category and a-z):\n\n- Hat  -\n  Bandana ![](dodge/bandana.png),\n  Beanie ![](dodge/beanie.png),\n  Cap  ![](dodge/cap.png),\n  Cap Forward ![](dodge/capforward.png),\n  Cowboy Hat ![](dodge/cowboyhat.png),\n  Fedora ![](dodge/fedora.png),\n  Headband ![](dodge/headband.png),\n  Knitted Cap ![](dodge/knittedcap.png),\n  Tiara ![](dodge/tiara.png),\n  Top Hat ![](dodge/tophat.png)\n- Hair -\n  Crazy Hair ![](dodge/crazyhair.png)\n- Eyes -\n  3D Glasses ![](dodge/3dglasses.png),\n  Big Shades  ![](dodge/bigshades.png),\n  Classic Shades ![](dodge/classicshades.png),\n  Eye Patch   ![](dodge/eyepatch.png),\n  Nerd Glasses  ![](dodge/nerdglasses.png),\n  Regular Shades  ![](dodge/regularshades.png),\n  Small Shades  ![](dodge/smallshades.png)\n\n\n(Source: [Punk (Building) Blocks - Dodge Series (24×24)](https://github.com/cryptopunksnotdead/punks.blocks#dodge-series-2424))\n\n\n\n### Step 1 -  Generate A List of Your Pixel Art Collection in Tabular Text Format (Spreadsheet)\n\nIn the first sample let's generate the list of the pixel art collection\nby hand. Let's use a rarity \u0026 popularity distribution of\n10 classic Shibas, 7 darkies, 5 zombies and 3 aliens.  Example  -  [`dodge.csv`](no1/dodge.csv):\n\n``` csv\ntype,       attribute1,   attribute2\nClassic,    3D Glasses\nClassic,    Beanie\nClassic,    Cap,          Regular Shades\nClassic,    Cowboy Hat\nClassic,    Eye Patch\nClassic,    Knitted Cap\nClassic,    Nerd Glasses\nClassic,    Big Shades\nClassic,    Knitted Cap,  Regular Shades\nClassic\nDark,       Tiara\nDark,       Big Shades\nDark,       3D Glasses\nDark,       Classic Shades\nDark,       Cap\nDark,       Cap,          Regular Shades\nDark,       Tiara,        Big Shades\nZombie,     Knitted Cap\nZombie,     Eye Patch\nZombie,     Regular Shades\nZombie,     Knitted Cap,  Regular Shades\nZombie\nAlien,      Cap,          Small Shades\nAlien,      Headband\nAlien,      Classic Shades\n```\n\nYes, that's it.\nFor the list format let's use the comma-separated values (.CSV) format supported by all spreadsheet programs.\nEvery line is a record of a punk\nmade up of the original type  and one or more attributes.\n\nNote: Let's NOT add the index number (0,1,2,3, and so on).\nWhy? That way you can easily\nreshuffle your collection anytime.\nLet's try a more \"random\" look by hand:\n\n\n``` csv\ntype,       attribute1,   attribute2\nClassic,    3D Glasses\nDark,       Tiara\nClassic,    Beanie\nZombie,     Knitted Cap\nAlien,      Cap,          Small Shades\nDark,       Big Shades\nZombie,     Eye Patch\nClassic,    Cap,          Regular Shades\nClassic,    Cowboy Hat\nClassic,    Eye Patch\nAlien,      Headband\nClassic,    Knitted Cap\nDark,       3D Glasses\nZombie,     Regular Shades\nClassic,    Nerd Glasses\nClassic,    Big Shades\nDark,       Cap\nZombie\nClassic,    Knitted Cap,  Regular Shades\nClassic\nDark,       Classic Shades\nDark,       Cap,          Regular Shades\nAlien,      Classic Shades\nDark,       Tiara,        Big Shades\nZombie,     Knitted Cap,  Regular Shades\n```\n\n\n\n### Step 2  - Generate All Pixel Art Images in Original Format and In 20x\n\n\nNow the \"magic\" let's read in the list\nin the comma-separated values (.CSV) format\nand generate all pixel art images in the original format\n(24×24) and in 20x (480×480).\n\n\n``` ruby\nrequire './boot'\n\n\nrecs = read_csv( './no1/dodge.csv' )\nputs \"  #{recs.size} punk(s)\"\n#=\u003e  25 punk(s)\n\n\nart = Art.new( dir: './dodge' )\n\nrecs.each_with_index do |rec,i|\n  name = \"punk#{i}\"\n  punk = art.generate( rec )\n\n  punk.save( \"./o/no1/#{name}.png\" )\n  punk.zoom(20).save( \"./o/no1/#{name}@20x.png\" )\nend\n```\n\nYes, that's it.\nRun the script to generate algorithmically your collection.\n\nIn the `/o` directory you will now find\ntwo images per punk - in the orginal format, that is, 24×24\nand 20x, that is, 480×480 - and get:\n\n```\nno1/\n  punk0.png\n  punk0@20x.png\n  punk1.png\n  punk1@20x.png\n  punk2.png\n  punk2@20x.png\n  punk3.png\n  punk3@20x.png\n  punk4.png\n  punk4@20x.png\n  punk5.png\n  punk5@20x.png\n  punk6.png\n  punk6@20x.png\n  punk7.png\n  punk7@20x.png\n  punk8.png\n  punk8@20x.png\n  ...\n```\n\nLet's open up `punk0.png` to `punk24.png`:\n\n![](i/no1/punk0.png)\n![](i/no1/punk1.png)\n![](i/no1/punk2.png)\n![](i/no1/punk3.png)\n![](i/no1/punk4.png)\n![](i/no1/punk5.png)\n![](i/no1/punk6.png)\n![](i/no1/punk7.png)\n![](i/no1/punk8.png)\n![](i/no1/punk9.png)\n![](i/no1/punk10.png)\n![](i/no1/punk11.png)\n![](i/no1/punk12.png)\n![](i/no1/punk13.png)\n![](i/no1/punk14.png)\n![](i/no1/punk15.png)\n![](i/no1/punk16.png)\n![](i/no1/punk17.png)\n![](i/no1/punk18.png)\n![](i/no1/punk19.png)\n![](i/no1/punk20.png)\n![](i/no1/punk21.png)\n![](i/no1/punk22.png)\n![](i/no1/punk23.png)\n![](i/no1/punk24.png)\n\n\nAnd let's have a looksie at the biggie 20x (480×480) versions:\n\n![](i/no1/punk0@20x.png)\n\n![](i/no1/punk1@20x.png)\n\n[...]\n\n![](i/no1/punk24@20x.png)\n\n\n\nNote: If you use your own artwork\nmake sure your type and attribute names\nused in the list in the comma-separated values (.CSV) format\nmatch the filenames (without the `.png` extension).\nFor the matching algorithm all names\nget automatically downcased and all spaces deleted,\nthus,\n`Classic` will map to `classic.png` ![](dodge/classic.png)\nand `3D Glasses` to `3dglasses.png` ![](dodge/3dglasses.png)\nand `Knitted Cap` to `knittedcap.png` ![](dodge/knittedcap.png)\nand so on.\n\n\n\n\n### Step 3 - Bonus: Generate an All-In-One Composite Image\n\nLet's generate an all-in-one composite image holding the complete\ncollection in a 5×5 grid.\n\n``` ruby\nrequire './boot'\n\n\nrecs = read_csv( './no1/dodge.csv' )\nputs \"  #{recs.size} punk(s)\"\n#=\u003e  25 punk(s)\n\n\nart = Art.new( dir: './dodge' )\n\n\n## 5×5 grid with every tile 24×24\npunks = CompositeImage.new( 5, 5 )\n\nrecs.each_with_index do |rec,i|\n  punk = art.generate( rec )\n  punks \u003c\u003c punk\nend\n\npunks.save( './o/no1/punks.png')\n```\n\nYes, that's it.\nRun the script to generate algorithmically your collection\nin an all-in-one composite.\n\nOpen up `punks.png` to have a looksie.\n\n![](i/no1/punks.png)\n\n\n\n\n\n\n\n## Collection №2 -  The First One Hundred Pixel Art Punks\n\nLet's take on a bigger pixel art collection.\nLet's generate a pixel-perfect copy of the first one hundred punks in the original Larva Labs series in the classic 24×24\nformat.\n\n\nLet's copy and (re)use all punk (building) blocks\nin the basic series (24×24):\n\nMale 1/2/3/4 ![](basic/male1.png)\n![](basic/male2.png)\n![](basic/male3.png)\n![](basic/male4.png),\nFemale 1/2/3/4 ![](basic/female1.png)\n![](basic/female2.png)\n![](basic/female3.png)\n![](basic/female4.png),\nZombie ![](basic/zombie.png),\nApe ![](basic/ape.png),\nAlien ![](basic/alien.png)\n\n\u003c!-- note:\n  sort attributes a-z for now - why? why not?\n--\u003e\n\nAttributes (by category and a-z):\n- Hat -\n  Bandana (m/f)\n  ![](basic/m/bandana.png)\n  ![](basic/f/bandana.png),\n  Beanie (m)\n  ![](basic/m/beanie.png),\n  Cap (m/f)\n  ![](basic/m/cap.png)\n  ![](basic/f/cap.png),\n  Cap Forward (m)\n  ![](basic/m/capforward.png),\n  Cowboy Hat (m)\n  ![](basic/m/cowboyhat.png),\n  Do-rag (m)\n  ![](basic/m/dorag.png),\n  Fedora (m)\n  ![](basic/m/fedora.png),\n  Headband (m/f)\n  ![](basic/m/headband.png)\n  ![](basic/f/headband.png),\n  Hoodie (m)\n  ![](basic/m/hoodie.png),\n  Knitted Cap (m/f)\n  ![](basic/m/knittedcap.png)\n  ![](basic/f/knittedcap.png),\n  Pilot Helmet (f)\n  ![](basic/f/pilothelmet.png),\n  Police Cap (m)\n  ![](basic/m/policecap.png),\n  Tassle Hat (f)\n  ![](basic/f/tasslehat.png),\n  Tiara (f)\n  ![](basic/f/tiara.png),\n  Top Hat (m)\n  ![](basic/m/tophat.png)\n- Hair -\n  Blonde Bob (f)\n  ![](basic/f/blondebob.png),\n  Blonde Short (f)\n  ![](basic/f/blondeshort.png),\n  Clown Hair Green (m/f)\n  ![](basic/m/clownhairgreen.png)\n  ![](basic/f/clownhairgreen.png),\n  Crazy Hair (m/f)\n  ![](basic/m/crazyhair.png)\n  ![](basic/f/crazyhair.png),\n  Dark Hair (f)\n  ![](basic/f/darkhair.png),\n  Frumpy Hair (m/f)\n  ![](basic/m/frumpyhair.png)\n  ![](basic/f/frumpyhair.png),\n  Half Shaved (f)\n  ![](basic/f/halfshaved.png),\n  Messy Hair (m/f)\n  ![](basic/m/messyhair.png)\n  ![](basic/f/messyhair.png),\n  Mohawk (m/f)\n  ![](basic/m/mohawk.png)\n  ![](basic/f/mohawk.png),\n  Mohawk Dark (m/f)\n  ![](basic/m/mohawkdark.png)\n  ![](basic/f/mohawkdark.png),\n  Mohawk Thin (m/f)\n  ![](basic/m/mohawkthin.png)\n  ![](basic/f/mohawkthin.png),\n  Orange Side (f)\n  ![](basic/f/orangeside.png),\n  Peak Spike (m)\n  ![](basic/m/peakspike.png),\n  Pigtails (f)\n  ![](basic/f/pigtails.png),\n  Pink With Hat (f)\n  ![](basic/f/pinkwithhat.png),\n  Purple Hair (m)\n  ![](basic/m/purplehair.png),\n  Red Mohawk (f)\n  ![](basic/f/redmohawk.png),\n  Shaved Head (m)\n  ![](basic/m/shavedhead.png),\n  Straight Hair (f)\n  ![](basic/f/straighthair.png),\n  Straight Hair Blonde (f)\n  ![](basic/f/straighthairblonde.png),\n  Straight Hair Dark (f)\n  ![](basic/f/straighthairdark.png),\n  Stringy Hair (m/f)\n  ![](basic/m/stringyhair.png)\n  ![](basic/f/stringyhair.png),\n  Vampire Hair (m)\n  ![](basic/m/vampirehair.png),\n  Wild Blonde (f)\n  ![](basic/f/wildblonde.png),\n  Wild Hair (m/f)\n  ![](basic/m/wildhair.png)\n  ![](basic/f/wildhair.png),\n  Wild White Hair (f)\n  ![](basic/f/wildwhitehair.png)\n- Eyes -\n  3D Glasses (m/f)\n   ![](basic/m/3dglasses.png)\n   ![](basic/f/3dglasses.png),\n  Big Shades (m/f)\n  ![](basic/m/bigshades.png)\n  ![](basic/f/bigshades.png),\n  Classic Shades (m/f)\n  ![](basic/m/classicshades.png)\n  ![](basic/f/classicshades.png),\n  Eye Mask (m/f)\n  ![](basic/m/eyemask.png)\n  ![](basic/f/eyemask.png),\n  Eye Patch (m/f)\n  ![](basic/m/eyepatch.png)\n  ![](basic/f/eyepatch.png),\n  Horned Rim Glasses (m/f)\n  ![](basic/m/hornedrimglasses.png)\n  ![](basic/f/hornedrimglasses.png),\n  Nerd Glasses (m/f)\n  ![](basic/m/nerdglasses.png)\n  ![](basic/f/nerdglasses.png),\n  Regular Shades (m/f)\n  ![](basic/m/regularshades.png)\n  ![](basic/f/regularshades.png),\n  Small Shades (m)\n  ![](basic/m/smallshades.png),\n  VR (m/f)\n  ![](basic/m/vr.png)\n  ![](basic/f/vr.png),\n  Welding Goggles (f)\n  ![](basic/f/weldinggoggles.png)\n- Eyes (Makeup) -\n  Blue Eye Shadow (f)\n  ![](basic/f/blueeyeshadow.png),\n  Clown Eyes Blue (m/f)\n  ![](basic/m/clowneyesblue.png)\n  ![](basic/f/clowneyesblue.png),\n  Clown Eyes Green (m/f)\n  ![](basic/m/clowneyesgreen.png)\n  ![](basic/f/clowneyesgreen.png),\n  Green Eye Shadow (f)\n  ![](basic/f/greeneyeshadow.png),\n  Purple Eye Shadow (f)\n  ![](basic/f/purpleeyeshadow.png)\n- Blemishes -\n  Mole (m/f)\n   ![](basic/m/mole.png)\n   ![](basic/f/mole.png),\n  Rosy Cheeks (m/f)\n   ![](basic/m/rosycheeks.png)\n   ![](basic/f/rosycheeks.png),\n  Spots (m/f)\n   ![](basic/m/spots.png)\n   ![](basic/f/spots.png)\n- Nose -\n  Clown Nose (m/f)\n   ![](basic/m/clownnose.png)\n   ![](basic/f/clownnose.png),\n- Ears -\n  Earring (m/f)\n   ![](basic/m/earring.png)\n   ![](basic/f/earring.png)\n- Mouth -\n  Buck Teeth (m)\n   ![](basic/m/buckteeth.png),\n  Frown (m)\n   ![](basic/m/frown.png),\n  Smile (m)\n   ![](basic/m/smile.png)\n- Mouth (Makeup) -\n  Black Lipstick (f)\n   ![](basic/f/blacklipstick.png),\n  Hot Lipstick (f)\n   ![](basic/f/hotlipstick.png),\n  Purple Lipstick (f)\n   ![](basic/f/purplelipstick.png)\n- Mouth Prop -\n  Cigarette (m/f)\n   ![](basic/m/cigarette.png)\n   ![](basic/f/cigarette.png),\n  Medical Mask (m/f)\n   ![](basic/m/medicalmask.png)\n   ![](basic/f/medicalmask.png),\n  Pipe (m/f)\n   ![](basic/m/pipe.png)\n   ![](basic/f/pipe.png),\n  Vape (m/f)\n   ![](basic/m/vape.png)\n   ![](basic/f/vape.png)\n- Beard -\n  Big Beard (m)\n   ![](basic/m/bigbeard.png),\n  Chinstrap (m)\n   ![](basic/m/chinstrap.png),\n  Front Beard (m)\n   ![](basic/m/frontbeard.png),\n  Front Beard Dark (m)\n   ![](basic/m/frontbearddark.png),\n  Goat (m)\n   ![](basic/m/goat.png),\n  Handlebars (m)\n   ![](basic/m/handlebars.png),\n  Luxurious Beard (m)\n   ![](basic/m/luxuriousbeard.png),\n  Mustache (m)\n   ![](basic/m/mustache.png),\n  Muttonchops (m)\n   ![](basic/m/muttonchops.png),\n  Normal Beard (m)\n   ![](basic/m/normalbeard.png),\n  Normal Beard Black (m)\n   ![](basic/m/normalbeardblack.png),\n  Shadow Beard (m)\n   ![](basic/m/shadowbeard.png)\n- Neck Accessory -\n  Choker (f)\n   ![](basic/f/choker.png),\n  Gold Chain (m/f)\n   ![](basic/m/goldchain.png)\n   ![](basic/f/goldchain.png),\n  Silver Chain (m/f)\n   ![](basic/m/silverchain.png)\n   ![](basic/f/silverchain.png)\n\n\n\u003c!-- break --\u003e\n\n(Source: [Punk (Building) Blocks - Basic Series (24×24)](https://github.com/cryptopunksnotdead/punks.blocks#basic-punk-series-2424))\n\n\nBonus - Let's add Laser Eyes (m) ![](basic/m/lasereyes.png),\nLaser Eyes Gold (m) ![](basic/m/lasereyesgold.png).\n\n\n\n\n### Step 1 -  Generate A List of Your Pixel Art Collection in Tabular Text Format (Spreadsheet)\n\nLet's again generate the list of the pixel art collection\nby hand. Let's (re)use the rarity \u0026 popularity distribution of\nthe original series that starts with 56 males and 44 females.\n\nNote: Let's use numbers for the four\nmale and female (arche)types\nskintone variants, that is,\n1 - darker, 2 - dark, 3 - light, 4 - lighter.\nExample  -  [`punks.csv`](no2/punks.csv):\n\n``` csv\ntype,        attribute1, attribute2, attribute3, attribute4, attribute5\nFemale 2, Earring, Blonde Bob, Green Eye Shadow\nMale 1, Smile, Mohawk, Laser Eyes\nFemale 3, Wild Hair\nMale 1, Wild Hair, Pipe, Nerd Glasses\nMale 2, Goat, Earring, Wild Hair, Big Shades\nFemale 2, Earring, Half Shaved, Purple Eye Shadow\nMale 2, Do-rag, Laser Eyes Gold\nFemale 2, Spots, Wild White Hair, Clown Eyes Blue\nMale 1, Luxurious Beard, Messy Hair\nMale 2, Big Beard, Police Cap, Clown Nose\nFemale 1, Mohawk, Blue Eye Shadow\nFemale 2, Black Lipstick, Straight Hair Dark, Clown Eyes Green\nFemale 1, Purple Lipstick, Blonde Short\nFemale 3, Black Lipstick, Straight Hair Blonde, Big Shades\nFemale 1, Hot Lipstick, Pilot Helmet, Pipe\nMale 4, Luxurious Beard, Wild Hair, Regular Shades\nMale 2, Earring, Stringy Hair, Small Shades\nMale 3, Frown, Mohawk\nMale 2, Muttonchops, Eye Mask\nFemale 1, Hot Lipstick, Bandana, Horned Rim Glasses\nMale 3, Crazy Hair\nMale 3, Earring, Messy Hair, Classic Shades\nFemale 1, Purple Lipstick, Pilot Helmet\nMale 3, Handlebars, Earring, Do-rag\nMale 3, Smile, Mohawk Dark\nFemale 1, Wild White Hair\nFemale 2, Dark Hair\nMale 3, Earring, Peak Spike\nMale 1, Crazy Hair, Big Shades\nFemale 2, Earring, Half Shaved, Horned Rim Glasses\nMale 1, Normal Beard Black, Cap\nFemale 1, Stringy Hair\nMale 3, Frown, VR\nMale 3, Peak Spike\nFemale 3, Purple Lipstick, Frumpy Hair\nMale 1, Normal Beard, Earring, Peak Spike, Cigarette, Horned Rim Glasses\nFemale 2, Red Mohawk\nFemale 1, Cap, Clown Eyes Blue\nFemale 3, Purple Lipstick, Frumpy Hair, Classic Shades\nMale 3, Frown, Shaved Head, Regular Shades\nMale 3, Smile, Chinstrap, Bandana\nMale 1, Muttonchops, Wild Hair, Clown Eyes Green\nFemale 1, Wild Hair, Cigarette\nFemale 2, Half Shaved\nMale 3, Messy Hair\nMale 2, Mole, Earring\nFemale 2, Purple Lipstick, Straight Hair Dark\nMale 1, Knitted Cap\nMale 3, Mohawk, Big Shades\nFemale 1, Bandana, Purple Eye Shadow\nMale 2, Spots, Fedora\nMale 2, Muttonchops, Earring, Wild Hair\nMale 1, Shadow Beard, Earring, Knitted Cap, Nerd Glasses\nFemale 3, Straight Hair, Big Shades\nMale 1, Hoodie\nMale 3, Eye Patch\nMale 1, Shaved Head\nMale 3, Headband\nMale 2, Normal Beard Black, Hoodie\nMale 4, Muttonchops, Cowboy Hat\nFemale 3, Purple Lipstick, Stringy Hair\nFemale 3, Dark Hair\nFemale 1, Hot Lipstick, Earring, Mohawk Dark, Clown Eyes Blue\nMale 1, Earring, Shaved Head, Small Shades\nFemale 2, Purple Lipstick, Straight Hair Blonde\nFemale 2, Headband, Eye Mask\nFemale 1, Tassle Hat\nFemale 1, Purple Lipstick, Half Shaved, 3D Glasses\nMale 1, Do-rag, Nerd Glasses\nMale 2, Normal Beard Black, Fedora\nFemale 2, Earring, Crazy Hair, Cigarette, Regular Shades\nFemale 3, Purple Lipstick, Half Shaved, Green Eye Shadow\nMale 1, Normal Beard, Earring, Fedora, Nerd Glasses\nFemale 2, Black Lipstick, Earring, Bandana\nMale 1, Shadow Beard, Earring, Mohawk Dark\nMale 3, Shadow Beard, Knitted Cap, Eye Patch\nMale 3, Do-rag, Cigarette\nMale 1, Handlebars, Stringy Hair\nMale 2, Handlebars, Knitted Cap, Eye Patch\nMale 1, Normal Beard, Mohawk Dark\nMale 4, Mustache, Wild Hair\nMale 3, Headband, Small Shades\nMale 4, Headband\nMale 3, Shaved Head, Vape, Small Shades\nMale 3, Earring, Messy Hair, Big Shades\nFemale 1, Crazy Hair\nFemale 1, Hot Lipstick, Earring, Knitted Cap, Green Eye Shadow\nMale 3, Earring, Hoodie\nFemale 3, Hot Lipstick, Cap\nFemale 1, Choker\nMale 2, Hoodie, Eye Patch\nFemale 3, Straight Hair, Clown Nose\nFemale 3, Purple Lipstick, Pink With Hat, Nerd Glasses\nFemale 3, Bandana\nFemale 1, Earring, Pink With Hat, Regular Shades\nMale 2, Earring, Mohawk\nFemale 3, Blonde Bob\nMale 2, Wild Hair\nFemale 3, Black Lipstick, Dark Hair, Welding Goggles\nMale 2, Hoodie, Cigarette\n```\n\nNote - see if you can spot the never-befor-seen super rare punks\nwith Laser Eyes and Laser Eyes Gold.\n\n\n\n### Step 2  - Generate All Pixel Art Images in Original Format and In 20x\n\nNow the \"magic\" let's read in the list\nin the comma-separated values (.CSV) format\nand generate all pixel art images in the original format\n(24×24) and in 20x (480×480).\n\n\n``` ruby\nrequire './boot'\n\n\nrecs = read_csv( './no2/punks.csv' )\nputs \"  #{recs.size} punk(s)\"\n#=\u003e  100 punk(s)\n\nart = Art.new(\n        dir: './basic',\n        qualifier: { 'm' =\u003e ['Male 1', 'Male 2', 'Male 3', 'Male 4',\n                             'Zombie',\n                             'Ape',\n                             'Alien'],\n                      'f' =\u003e ['Female 1', 'Female 2', 'Female 3', 'Female 4'],\n                   })\n\nrecs.each_with_index do |rec,i|\n  name = \"punk#{i}\"\n  punk = art.generate( rec )\n\n  punk.save( \"./o/no2/#{name}.png\" )\n  punk.zoom(20).save( \"./o/no2/#{name}@20x.png\" )\nend\n```\n\nNote: The attributes (see above) come\nin two editions, that is,  m - male (stored in the `/m` directory)\nand f - female (stored in the `/f` directory).\nTo map the attribute (or \"qualify\"\nthe name with an extra auto-added directory)\nlet's configure\nthe \"qualifier\" by archetype, that is,\nMale 1/2/3/4, Zombie, Ape and Alien will auto-add the `/m` directory\nto the attribute image lookup and\nFemale 1/2/3/4 will aut-add the `/f` directory.\n\n\nYes, that's it.\nRun the script to generate algorithmically your collection.\n\nIn the `/o` directory you will now find\ntwo images per punk - in the orginal format, that is, 24×24\nand 20x, that is, 480×480 - and get:\n\n```\nno2/\n  punk0.png\n  punk0@20x.png\n  punk1.png\n  punk1@20x.png\n  punk2.png\n  punk2@20x.png\n  punk3.png\n  punk3@20x.png\n  punk4.png\n  punk4@20x.png\n  punk5.png\n  punk5@20x.png\n  punk6.png\n  punk6@20x.png\n  punk7.png\n  punk7@20x.png\n  punk8.png\n  punk8@20x.png\n  ...\n```\n\nLet's open up `punk0.png` to `punk99.png`:\n\n![](i/no2/punk0.png)\n![](i/no2/punk1.png)\n![](i/no2/punk2.png)\n![](i/no2/punk3.png)\n![](i/no2/punk4.png)\n![](i/no2/punk5.png)\n![](i/no2/punk6.png)\n![](i/no2/punk7.png)\n![](i/no2/punk8.png)\n![](i/no2/punk9.png)\n![](i/no2/punk10.png)\n![](i/no2/punk11.png)\n![](i/no2/punk12.png)\n![](i/no2/punk13.png)\n![](i/no2/punk14.png)\n![](i/no2/punk15.png)\n![](i/no2/punk16.png)\n![](i/no2/punk17.png)\n![](i/no2/punk18.png)\n![](i/no2/punk19.png)\n![](i/no2/punk20.png)\n![](i/no2/punk21.png)\n![](i/no2/punk22.png)\n![](i/no2/punk23.png)\n![](i/no2/punk24.png)\n![](i/no2/punk25.png)\n![](i/no2/punk26.png)\n![](i/no2/punk27.png)\n![](i/no2/punk28.png)\n![](i/no2/punk29.png)\n![](i/no2/punk30.png)\n![](i/no2/punk31.png)\n![](i/no2/punk32.png)\n![](i/no2/punk33.png)\n![](i/no2/punk34.png)\n![](i/no2/punk35.png)\n![](i/no2/punk36.png)\n![](i/no2/punk37.png)\n![](i/no2/punk38.png)\n![](i/no2/punk39.png)\n![](i/no2/punk40.png)\n![](i/no2/punk41.png)\n![](i/no2/punk42.png)\n![](i/no2/punk43.png)\n![](i/no2/punk44.png)\n![](i/no2/punk45.png)\n![](i/no2/punk46.png)\n![](i/no2/punk47.png)\n![](i/no2/punk48.png)\n![](i/no2/punk49.png)\n![](i/no2/punk50.png)\n![](i/no2/punk51.png)\n![](i/no2/punk52.png)\n![](i/no2/punk53.png)\n![](i/no2/punk54.png)\n![](i/no2/punk55.png)\n![](i/no2/punk56.png)\n![](i/no2/punk57.png)\n![](i/no2/punk58.png)\n![](i/no2/punk59.png)\n![](i/no2/punk60.png)\n![](i/no2/punk61.png)\n![](i/no2/punk62.png)\n![](i/no2/punk63.png)\n![](i/no2/punk64.png)\n![](i/no2/punk65.png)\n![](i/no2/punk66.png)\n![](i/no2/punk67.png)\n![](i/no2/punk68.png)\n![](i/no2/punk69.png)\n![](i/no2/punk70.png)\n![](i/no2/punk71.png)\n![](i/no2/punk72.png)\n![](i/no2/punk73.png)\n![](i/no2/punk74.png)\n![](i/no2/punk75.png)\n![](i/no2/punk76.png)\n![](i/no2/punk77.png)\n![](i/no2/punk78.png)\n![](i/no2/punk79.png)\n![](i/no2/punk80.png)\n![](i/no2/punk81.png)\n![](i/no2/punk82.png)\n![](i/no2/punk83.png)\n![](i/no2/punk84.png)\n![](i/no2/punk85.png)\n![](i/no2/punk86.png)\n![](i/no2/punk87.png)\n![](i/no2/punk88.png)\n![](i/no2/punk89.png)\n![](i/no2/punk90.png)\n![](i/no2/punk91.png)\n![](i/no2/punk92.png)\n![](i/no2/punk93.png)\n![](i/no2/punk94.png)\n![](i/no2/punk95.png)\n![](i/no2/punk96.png)\n![](i/no2/punk97.png)\n![](i/no2/punk98.png)\n![](i/no2/punk99.png)\n\n\nAnd let's have a looksie at the biggie 20x (480×480) versions:\n\n![](i/no2/punk0@20x.png)\n\n![](i/no2/punk1@20x.png)\n\n[...]\n\n![](i/no2/punk99@20x.png)\n\n\n\n\n### Step 3 - Bonus: Generate an All-In-One Composite Image\n\nAgain let's generate an all-in-one composite image holding the complete\ncollection in a 10×10 grid.\n\n``` ruby\nrequire './boot'\n\n\nrecs = read_csv( './no2/punks.csv' )\nputs \"  #{recs.size} punk(s)\"\n#=\u003e  100 punk(s)\n\n\nart = Art.new(\n        dir: './basic',\n        qualifier: { 'm' =\u003e ['Male 1', 'Male 2', 'Male 3', 'Male 4',\n                             'Zombie',\n                             'Ape',\n                             'Alien'],\n                      'f' =\u003e ['Female 1', 'Female 2', 'Female 3', 'Female 4'],\n                   })\n\n\n## 10×10 grid with every tile 24×24\npunks = CompositeImage.new( 10, 10 )\n\nrecs.each_with_index do |rec,i|\n  punk = art.generate( rec )\n  punks \u003c\u003c punk\nend\n\npunks.save( './o/no2/punks.png')\n```\n\nYes, that's it.\nRun the script to generate algorithmically your collection\nin an all-in-one composite.\n\nOpen up `punks.png` to have a looksie.\n\n![](i/no2/punks.png)\n\n\n\n\n\n## Collection №3 -  The First One Hundred Pixel Art Punks - The Black \u0026 White (Pencil Drawing) Sketch Edition\n\nLet's redo the the first one hundred pixel art punks collection\nand let's pick a pixel art special effect.\n\nTip:  See [**Pixel Art Special Effects Gallery / Cheatsheet - Free Ideas \u0026 Recipes for Starting Your Own CryptoPunks Collection Today**](https://github.com/cryptopunksnotdead/programming-cryptopunks/blob/master/A1_special_effects.md)\nin the free (online) Programming CryptoPunks \u0026 Copypasta Step-by-Step Book(let).\n\n\n\n### Step 1 -  Generate A List of Your Pixel Art Collection in Tabular Text Format (Spreadsheet)\n\nSame as in collection №2 above.\nLet's (re)use [`punks.csv`](no3/punks.csv).\n\n\n### Step 2  - Generate All Pixel Art Images in Original Format and In 20x\n\n\nSame as in collection №2 above.\nPlus let's try the black \u0026 white (pencil drawing) sketch special effect.\n\n\n``` ruby\n#  [..]\n\nrecs.each_with_index do |rec,i|\n  name = \"punk#{i}\"\n  punk = art.generate( rec )\n\n  punk_sketch = punk.sketch( 1, line: 1 )\n  punk_sketch.save( \"./o/no3/#{name}.png\" )\n\n  punk_sketch = punk.sketch( 20, line: 4 )\n  punk_sketch.save( \"./o/no3/#{name}@20x.png\" )\nend\n```\n\nNote: The minimum format for a black \u0026 white (pencil drawing) sketch\nis 49×49px (24\\*1 + 25\\*1 = 49px), that is,  24 \"inner\" white pixels and 25 \"outline\" black pixels.\nAnd the 20x version becomes 580×580px (20\\*24 + 4\\*25 = 580px),\nthat is, with a 24\\*20 \"inner\"\nwhite pixel and 25\\*4 \"outline\" black pixels.\n\n\nYes, that's it.\nRun the script to generate algorithmically your collection.\n\nIn the `/o` directory you will now find\ntwo images per punk - in the orginal format, that is, 49×49\nand 20x, that is, 580×580 - and get:\n\n```\nno3/\n  punk0.png\n  punk0@20x.png\n  punk1.png\n  punk1@20x.png\n  punk2.png\n  punk2@20x.png\n  punk3.png\n  punk3@20x.png\n  punk4.png\n  punk4@20x.png\n  punk5.png\n  punk5@20x.png\n  punk6.png\n  punk6@20x.png\n  punk7.png\n  punk7@20x.png\n  punk8.png\n  punk8@20x.png\n  ...\n```\n\nLet's open up `punk0.png` to `punk99.png`:\n\n![](i/no3/punk0.png)\n![](i/no3/punk1.png)\n![](i/no3/punk2.png)\n![](i/no3/punk3.png)\n![](i/no3/punk4.png)\n![](i/no3/punk5.png)\n![](i/no3/punk6.png)\n![](i/no3/punk7.png)\n![](i/no3/punk8.png)\n![](i/no3/punk9.png)\n![](i/no3/punk10.png)\n![](i/no3/punk11.png)\n![](i/no3/punk12.png)\n![](i/no3/punk13.png)\n![](i/no3/punk14.png)\n![](i/no3/punk15.png)\n![](i/no3/punk16.png)\n![](i/no3/punk17.png)\n![](i/no3/punk18.png)\n![](i/no3/punk19.png)\n![](i/no3/punk20.png)\n![](i/no3/punk21.png)\n![](i/no3/punk22.png)\n![](i/no3/punk23.png)\n![](i/no3/punk24.png)\n![](i/no3/punk25.png)\n![](i/no3/punk26.png)\n![](i/no3/punk27.png)\n![](i/no3/punk28.png)\n![](i/no3/punk29.png)\n![](i/no3/punk30.png)\n![](i/no3/punk31.png)\n![](i/no3/punk32.png)\n![](i/no3/punk33.png)\n![](i/no3/punk34.png)\n![](i/no3/punk35.png)\n![](i/no3/punk36.png)\n![](i/no3/punk37.png)\n![](i/no3/punk38.png)\n![](i/no3/punk39.png)\n![](i/no3/punk40.png)\n![](i/no3/punk41.png)\n![](i/no3/punk42.png)\n![](i/no3/punk43.png)\n![](i/no3/punk44.png)\n![](i/no3/punk45.png)\n![](i/no3/punk46.png)\n![](i/no3/punk47.png)\n![](i/no3/punk48.png)\n![](i/no3/punk49.png)\n![](i/no3/punk50.png)\n![](i/no3/punk51.png)\n![](i/no3/punk52.png)\n![](i/no3/punk53.png)\n![](i/no3/punk54.png)\n![](i/no3/punk55.png)\n![](i/no3/punk56.png)\n![](i/no3/punk57.png)\n![](i/no3/punk58.png)\n![](i/no3/punk59.png)\n![](i/no3/punk60.png)\n![](i/no3/punk61.png)\n![](i/no3/punk62.png)\n![](i/no3/punk63.png)\n![](i/no3/punk64.png)\n![](i/no3/punk65.png)\n![](i/no3/punk66.png)\n![](i/no3/punk67.png)\n![](i/no3/punk68.png)\n![](i/no3/punk69.png)\n![](i/no3/punk70.png)\n![](i/no3/punk71.png)\n![](i/no3/punk72.png)\n![](i/no3/punk73.png)\n![](i/no3/punk74.png)\n![](i/no3/punk75.png)\n![](i/no3/punk76.png)\n![](i/no3/punk77.png)\n![](i/no3/punk78.png)\n![](i/no3/punk79.png)\n![](i/no3/punk80.png)\n![](i/no3/punk81.png)\n![](i/no3/punk82.png)\n![](i/no3/punk83.png)\n![](i/no3/punk84.png)\n![](i/no3/punk85.png)\n![](i/no3/punk86.png)\n![](i/no3/punk87.png)\n![](i/no3/punk88.png)\n![](i/no3/punk89.png)\n![](i/no3/punk90.png)\n![](i/no3/punk91.png)\n![](i/no3/punk92.png)\n![](i/no3/punk93.png)\n![](i/no3/punk94.png)\n![](i/no3/punk95.png)\n![](i/no3/punk96.png)\n![](i/no3/punk97.png)\n![](i/no3/punk98.png)\n![](i/no3/punk99.png)\n\n\nAnd let's have a looksie at the biggie 20x (580×580) versions:\n\n![](i/no3/punk0@20x.png)\n\n![](i/no3/punk1@20x.png)\n\n[...]\n\n![](i/no3/punk99@20x.png)\n\n\n\n### Step 3 - Bonus: Generate an All-In-One Composite Image\n\nSame as in collection №2 above.\nPlus let's try the black \u0026 white (pencil drawing) sketch special effect.\n\n\n``` ruby\n#  [..]\n\n## 10×10 grid with every tile 49×49\npunks = CompositeImage.new( 10, 10, width: 49, height: 49 )\n\nrecs.each_with_index do |rec,i|\n  punk = art.generate( rec )\n\n  punk_sketch = punk.sketch( 1, line: 1 )\n\n  punks \u003c\u003c punk_sketch\nend\n\npunks.save( './o/no3/punks.png')\n```\n\nYes, that's it.\nRun the script to generate algorithmically your collection\nin an all-in-one composite.\n\nOpen up `punks.png` to have a looksie.\n\n![](i/no3/punks.png)\n\n\n\n\n## Collection №4 - 111 Cool Blue Aliens (Incl. Females \u0026 Super-Rare Apes)\n\n\nLet's try a super-rare never-before-seen pixel art collection.\nLet's generate a pixel-perfect copy of all nine\nsuper-rare cool blue humanoid aliens\nin the original Larva Labs series in the classic 24×24\nformat\nand for fun let's add a hundred more\nsuper-rare never-before-seen aliens incl. females and apes.\n\n\nLet's copy and (re)use punk (building) blocks\nin the female extension 50/50 series (24×24):\n\nAlien Female ![](basic/alienfemale.png)\n\nAnd in the planet of apes series (24×24):\n\nAlien Ape ![](basic/alienape.png)\n\n\nBonus - Let's add from the int'l headwear series (24×24)\nfor more fun:\n\nBear Skin (m)  ![](basic/m/bearskin.png),\nBeret (m)  ![](basic/m/beret.png),\nBoater (m)  ![](basic/m/boater.png),\nFez (m)  ![](basic/m/fez.png),\nFlamenco Hat (f)  ![](basic/f/flamencohat.png),\nFlower Crown (f)  ![](basic/f/flowercrown.png),\nPanama Hat (f)  ![](basic/f/panamahat.png),\nRoyal Cocktail Hat (f) ![](basic/f/royalcocktailhat.png),\nTuque (m)  ![](basic/m/tuque.png),\nTurban (m)  ![](basic/m/turban.png),\nTyrolean (f) ![](basic/f/tyrolean.png)\n\n\n### Step 1 -  Generate A List of Your Pixel Art Collection in Tabular Text Format (Spreadsheet)\n\nLet's again generate the list of the pixel art collection\nby hand. Let's start with\nthe nine super-rare million-dollar aliens from the original LarvaLabs series -\nincl. the top-selling (~$8 million in March, 11th 2021)\npipe-smoking \"Mr Mona Lisa\" -\nand wrap up with a hundred never-before-seen aliens\nincl. females and three alien apes.\n\nYes, let's add some laser eyes to get the buy-in from\nthe bitcon maxi club.\n\n\nExample  -  [`aliens.csv`](no4/aliens.csv):\n\n``` csv\ntype, attribute1, attribute2, attribute3, attribute4, attribute5\nAlien, Bandana, Regular Shades\nAlien, Cap\nAlien, Headband\nAlien, Earring, Cowboy Hat\nAlien, Bandana, Laser Eyes\nAlien, Do-rag, Small Shades\nAlien, Earring, Knitted Cap\nAlien, Earring, Knitted Cap, Medical Mask\nAlien, Cap Forward, Small Shades, Pipe\nAlien Female, Tiara, Rosy Cheeks\nAlien Female, Pigtails, Gold Chain\nAlien Female, Orange Side, 3D Glasses\nAlien Female, Wild Blonde\nAlien Female, Knitted Cap, Pipe\nAlien Female, Mohawk Dark, VR\nAlien Female, Half Shaved, Small Shades\nAlien, Mohawk Dark, VR\nAlien, Knitted Cap\nAlien, Crazy Hair, Gold Chain\nAlien, Top Hat, Laser Eyes Gold\nAlien, Hoodie, Silver Chain\nAlien, Police Cap\nAlien, Purple Hair, Laser Eyes\nAlien, Beanie, Small Shades, Gold Chain\nAlien, Vampire Hair, Buck Teeth\nAlien, Clown Hair Green, Clown Nose\nAlien, Bear Skin, 3D Glasses, Vape\nAlien, Mohawk Dark, Eye Mask\nAlien, Peak Spike\nAlien, Do-rag\nAlien, Boater, Buck Teeth, Classic Shades, Cigarette\nAlien, Beanie, Cigarette\nAlien Female, Wild White Hair, 3D Glasses\nAlien, Cowboy Hat, VR\nAlien Female, Panama Hat, Spots\nAlien Female, Flamenco Hat\nAlien, Frumpy Hair, 3D Glasses, Cigarette\nAlien, Cap, Laser Eyes Gold\nAlien Ape, Bandana\nAlien Female, Tyrolean, Classic Shades\nAlien, Hoodie, Big Shades\nAlien, Knitted Cap, Small Shades\nAlien, Hoodie, 3D Glasses, Pipe\nAlien, Peak Spike, Silver Chain\nAlien Female, Tassle Hat\nAlien Female, Pilot Helmet, Gold Chain\nAlien, Crazy Hair, Small Shades, Gold Chain\nAlien, Fedora, Small Shades\nAlien, Do-rag, Classic Shades\nAlien, Police Cap, Small Shades\nAlien, Earring, Purple Hair\nAlien, Top Hat, Medical Mask\nAlien, Cap, Nerd Glasses, Cigarette\nAlien, Turban\nAlien Female, Red Mohawk\nAlien Female, Sombrero, Medical Mask\nAlien Female, Top Hat, Gold Chain\nAlien Female, Beanie, Rosy Cheeks\nAlien Female, Mohawk Dark, Clown Eyes Blue, Choker\nAlien, Hoodie, 3D Glasses, Gold Chain, Pipe\nAlien, Earring, Mohawk Dark, Regular Shades\nAlien Female, Fedora, Gold Chain\nAlien Female, Earring, Cowboy Hat, Regular Shades\nAlien, Cowboy Hat, Laser Eyes\nAlien, Earring, Shaved Head, Eye Mask\nAlien Female, Earring, Royal Cocktail Hat, Clown Eyes Green\nAlien, Bandana\nAlien, Do-rag, Eye Patch\nAlien Female, Tiara, Clown Eyes Green\nAlien Female, Police Cap, Regular Shades, Gold Chain\nAlien Female, Earring, Cap, Clown Eyes Blue\nAlien, Stringy Hair, Small Shades, Mole\nAlien Female, Sombrero, Big Shades\nAlien, Cap Forward, Clown Eyes Blue, Silver Chain\nAlien, Vampire Hair, Clown Nose\nAlien Ape, Knitted Cap\nAlien, Clown Hair Green, Eye Mask\nAlien, Earring, Cap, 3D Glasses\nAlien, Mohawk Dark, Big Shades, Cigarette\nAlien Female, Earring, Tyrolean, Regular Shades\nAlien Female, Wild White Hair, Clown Eyes Blue\nAlien, Beanie, Eye Patch\nAlien, Crazy Hair, Small Shades, Silver Chain\nAlien, Tuque, 3D Glasses\nAlien Female, Hoodie, Clown Eyes Green\nAlien, Crazy Hair\nAlien, Earring, Cap Forward, 3D Glasses, Vape\nAlien Female, Pigtails, Nerd Glasses, Cigarette\nAlien Female, Clown Hair Green, Eye Patch\nAlien, Earring, Vampire Hair, Small Shades, Pipe\nAlien Female, Flower Crown, Rosy Cheeks, Regular Shades, Gold Chain, Cigarette\nAlien Female, Do-rag, Eye Patch\nAlien, Fedora, Small Shades, Pipe\nAlien, Beret, VR, Buck Teeth\nAlien, Frumpy Hair, Regular Shades, Cigarette\nAlien, Knitted Cap, Laser Eyes Gold, Cigarette\nAlien, Earring, Bandana\nAlien Female, Panama Hat, Gold Chain\nAlien Female, Tiara, Half Shaved\nAlien, Earring, Cap Forward\nAlien, Mohawk Thin, Mole\nAlien, Fez, Cigarette\nAlien Female, Flamenco Hat, Classic Shades\nAlien Ape, Hoodie\nAlien Female, Pilot Helmet, Clown Eyes Green, Choker\nAlien, Purple Hair, Medical Mask\nAlien, Stringy Hair, Eye Patch\nAlien, Earring, Regular Shades, Gold Chain\nAlien, Knitted Cap, Laser Eyes\nAlien Female, Purple Hair, Big Shades\nAlien Female, Royal Cocktail Hat, 3D Glasses\n```\n\n\n\n### Step 2  - Generate All Pixel Art Images in Original Format and In 20x\n\nNow the \"magic\" let's read in the list\nin the comma-separated values (.CSV) format\nand generate all pixel art images in the original format\n(24×24) and in 20x (480×480).\n\nBonus - Let's\ngenerate an all-in-one composite image holding the complete\ncollection in a 10×12 grid.\n\n\n``` ruby\nrequire './boot'\n\n\nrecs = read_csv( './no4/aliens.csv' )\nputs \"  #{recs.size} punk(s)\"\n#=\u003e  111 punk(s)\n\n\nart = Art.new(\n        dir: './basic',\n        qualifier: { 'm' =\u003e ['Male 1', 'Male 2', 'Male 3', 'Male 4',\n                             'Zombie',\n                             'Ape',\n                             'Alien', 'Alien Ape'],\n                     'f' =\u003e ['Female 1', 'Female 2', 'Female 3', 'Female 4',\n                             'Alien Female'],\n                   })\n\n\n## 10x12 grid with every tile 24×24\npunks = CompositeImage.new( 10, 12 )\n\n\nrecs.each_with_index do |rec,i|\n  name = \"punk#{i}\"\n  punk = art.generate( rec )\n\n  punk.save( \"./o/no4/#{name}.png\" )\n  punk.zoom(20).save( \"./o/no4/#{name}@20x.png\" )\n\n  punks \u003c\u003c punk  ## add to composite\nend\n\n\npunks.save( './o/no4/punks.png')   ## save composite\n```\n\nWhat's different from\nCollection №2 -  The First One Hundred Pixel Art Punks?\n\nTwo new achetypes, that is, Alien Ape and Alien Female in\nthe qualifier setting / configuration.\nYes, that's it.\nRun the script to generate algorithmically your collection.\n\n\nIn the `/o` directory you will now find\ntwo images per punk - in the orginal format, that is, 24×24\nand 20x, that is, 480×480 - and get:\n\n```\nno4/\n  punk0.png\n  punk0@20x.png\n  punk1.png\n  punk1@20x.png\n  punk2.png\n  punk2@20x.png\n  punk3.png\n  punk3@20x.png\n  punk4.png\n  punk4@20x.png\n  punk5.png\n  punk5@20x.png\n  punk6.png\n  punk6@20x.png\n  punk7.png\n  punk7@20x.png\n  punk8.png\n  punk8@20x.png\n  ...\n```\n\nLet's open up `punk0.png` to `punk110.png`:\n\n![](i/no4/punk0.png)\n![](i/no4/punk1.png)\n![](i/no4/punk2.png)\n![](i/no4/punk3.png)\n![](i/no4/punk4.png)\n![](i/no4/punk5.png)\n![](i/no4/punk6.png)\n![](i/no4/punk7.png)\n![](i/no4/punk8.png)\n![](i/no4/punk9.png)\n![](i/no4/punk10.png)\n![](i/no4/punk11.png)\n![](i/no4/punk12.png)\n![](i/no4/punk13.png)\n![](i/no4/punk14.png)\n![](i/no4/punk15.png)\n![](i/no4/punk16.png)\n![](i/no4/punk17.png)\n![](i/no4/punk18.png)\n![](i/no4/punk19.png)\n![](i/no4/punk20.png)\n![](i/no4/punk21.png)\n![](i/no4/punk22.png)\n![](i/no4/punk23.png)\n![](i/no4/punk24.png)\n![](i/no4/punk25.png)\n![](i/no4/punk26.png)\n![](i/no4/punk27.png)\n![](i/no4/punk28.png)\n![](i/no4/punk29.png)\n![](i/no4/punk30.png)\n![](i/no4/punk31.png)\n![](i/no4/punk32.png)\n![](i/no4/punk33.png)\n![](i/no4/punk34.png)\n![](i/no4/punk35.png)\n![](i/no4/punk36.png)\n![](i/no4/punk37.png)\n![](i/no4/punk38.png)\n![](i/no4/punk39.png)\n![](i/no4/punk40.png)\n![](i/no4/punk41.png)\n![](i/no4/punk42.png)\n![](i/no4/punk43.png)\n![](i/no4/punk44.png)\n![](i/no4/punk45.png)\n![](i/no4/punk46.png)\n![](i/no4/punk47.png)\n![](i/no4/punk48.png)\n![](i/no4/punk49.png)\n![](i/no4/punk50.png)\n![](i/no4/punk51.png)\n![](i/no4/punk52.png)\n![](i/no4/punk53.png)\n![](i/no4/punk54.png)\n![](i/no4/punk55.png)\n![](i/no4/punk56.png)\n![](i/no4/punk57.png)\n![](i/no4/punk58.png)\n![](i/no4/punk59.png)\n![](i/no4/punk60.png)\n![](i/no4/punk61.png)\n![](i/no4/punk62.png)\n![](i/no4/punk63.png)\n![](i/no4/punk64.png)\n![](i/no4/punk65.png)\n![](i/no4/punk66.png)\n![](i/no4/punk67.png)\n![](i/no4/punk68.png)\n![](i/no4/punk69.png)\n![](i/no4/punk70.png)\n![](i/no4/punk71.png)\n![](i/no4/punk72.png)\n![](i/no4/punk73.png)\n![](i/no4/punk74.png)\n![](i/no4/punk75.png)\n![](i/no4/punk76.png)\n![](i/no4/punk77.png)\n![](i/no4/punk78.png)\n![](i/no4/punk79.png)\n![](i/no4/punk80.png)\n![](i/no4/punk81.png)\n![](i/no4/punk82.png)\n![](i/no4/punk83.png)\n![](i/no4/punk84.png)\n![](i/no4/punk85.png)\n![](i/no4/punk86.png)\n![](i/no4/punk87.png)\n![](i/no4/punk88.png)\n![](i/no4/punk89.png)\n![](i/no4/punk90.png)\n![](i/no4/punk91.png)\n![](i/no4/punk92.png)\n![](i/no4/punk93.png)\n![](i/no4/punk94.png)\n![](i/no4/punk95.png)\n![](i/no4/punk96.png)\n![](i/no4/punk97.png)\n![](i/no4/punk98.png)\n![](i/no4/punk99.png)\n![](i/no4/punk100.png)\n![](i/no4/punk101.png)\n![](i/no4/punk102.png)\n![](i/no4/punk103.png)\n![](i/no4/punk104.png)\n![](i/no4/punk105.png)\n![](i/no4/punk106.png)\n![](i/no4/punk107.png)\n![](i/no4/punk108.png)\n![](i/no4/punk109.png)\n![](i/no4/punk110.png)\n\n\nAnd let's have a looksie at the biggie 20x (480×480) versions:\n\n![](i/no4/punk0@20x.png)\n\n![](i/no4/punk1@20x.png)\n\n[...]\n\n![](i/no4/punk110@20x.png)\n\n\nAnd open up `punks.png` for the all-in-one composite:\n\n![](i/no4/punks.png)\n\n\n\n\nTo be continued...\n\n\n\n\n\n\n\n\n## Appendix\n\n\n### Frequently Asked Questions (F.A.Qs)\n\n**Q:  Can I use a different pixel format for the collection e.g. 16×16 (instead of the classic 24×24)?**\n\nA: Yes,  it works with any square pixel size (e.g. 16×16, 24×24, 32×32).\nNote: If you use the `CompositeImage` the default width × height is set to 24 × 24 - if you use a different size\nyou have to pass in width and height e.g.\n\n``` ruby\n# 5×5 grid with every tile 16×16\ncomposite = CompositeImage.new( 5, 5, width: 16, height: 16 )\n```\n\n**Q: I am trying to make a composite of 30 variations with a base size of 125×125 px each. I can't seem to figure out how to adjust the settings to make it generate a composite without all of the results overlapping each other. Any ideas?**\n\nThe CompositeImage defaults to width: 24, height: 24, thus, if you use a different dimension / canvas\nyou have to pass along the \"custom\" width and height.\nExample with a 10×3 grid (equal to 30 tiles / variations)  and 125×125 width x height:\n\n``` ruby\ncomposite = CompositeImage.new( 10, 3, width: 125, height: 125 )\n```\n\n**Q: Is it possible to have more attributes, that is, seven instead of the five used in the sample collection №2?**\n\nYes, you can use as many attributes as you like\n(no limit really other than the computer processing power and memory) for the scripts / collections.\n\nIf you want to use seven attributes - add two more attributes to the tabular dataset - change:\n\n```\ntype, attribute1, attribute2, attribute3, attribute4, attribute5\nFemale 2, Earring, Blonde Bob, Green Eye Shadow\n...\n```\n\nto\n```\ntype, attribute1, attribute2, attribute3, attribute4, attribute5, attribute6, attribute7\nFemale 2, Earring, Blonde Bob, Green Eye Shadow\n...\n```\n\nThat's it.  By the way - the column names are \"arbitrary\", that is, yes you can use any name e.g. try hair, eyes, mouth, neck or such instead of attribute1, attribute2, etc.\n\n\n\n\n### Troubleshooting\n\n\n**Q: I cannot get the `./generate.rb` script to run [in Powershell / in Sublime / in ...]?**\n\nA: Make sure you run the script in the \"top-level\", that is, `/punks.starter` and you use `no1/generate.rb` or `no2/generate.rb` or `no3/generate.rb`:\n\n```\n/punks.starter\n   boot.rb\n   /no1\n      dodge.csv\n      generate.rb\n   /no2\n      punks.csv\n      generate.rb\n   /no3\n      punks.csv\n      generate.rb\n```\n\nAnd run inside the `/punks.starter` directory:\n\n```\n$ ruby no1/generate.rb          # start in /punks.starter\n```\n\n\n\u003c!--\n\n**Q: When running `ruby no1/generate.rb` (in /punks.starter) I get the error `wrong number of arguments (given 2, expected 1) (ArgumentError)` after upgrading to ruby 3.x, before that all was fine, please help.**\n\n```\npunks.starter\u003e $ ruby no1/generate.rb\npixelart/0.2.2 on Ruby 3.0.2 (2021-07-07)\n  csvreader-1.2.4/lib/csvreader/parser_std.rb:116:in `parse': wrong number of arguments (given 2, expected 1) (ArgumentError)\n    [...]\n    from punks.starter/generate.rb:8:in `read_csv'\n    from no1/generate.rb:10:in `\u003cmain\u003e'\n```\n\n\nA: Sorry for the trouble -  this is a known issue / bug -\nthe scripts run only on the ruby 2.x series for now.\nThis is a ruby 3.x non-backwards-compatibility issue (with keyword arguments) that needs to get fixed.\nIf you can downgrade to the 2.x series and retry.\n\nTo check that reading your .csv dataset works use something like (save as `testcsv.rb` in `/punks.starter`,\nfor example and run as `ruby ./testcsv.rb`):\n\n``` ruby\nrequire 'csvreader'\n\ndef read_csv( path )\n  CsvHash.read( path )\nend\n\nrecs = read_csv( './no1/dodge.csv' )\nputs \"  #{recs.size} record(s)\"\n#=\u003e  25 record(s)\n```\n\nOf course you might change `dodge.csv` to `punks.csv` or such and the record size will be different\ndepending on how many records you have and so on.\n\n--\u003e\n\n\n\n## Questions? Comments?\n\nPost them on the [D.I.Y. Punk (Pixel) Art reddit](https://old.reddit.com/r/DIYPunkArt). Thanks.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcryptopunksnotdead%2Fpunks.starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcryptopunksnotdead%2Fpunks.starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcryptopunksnotdead%2Fpunks.starter/lists"}