Image Generation

Image Generation

Composed from over 190 different assets across 12 separate layers, there are 18,332,600,000,000 (18.3 trillion) possible GOAT Tribe characters (not including background colour variance).

Every asset used in the GOAT Tribe NFTs is illustrated by hand and then randomly assembled by a custom Python algorithm.

Image Quality

In creating the GOAT Tribe we considered the permanence of the blockchain and therefore the potential for our collection to be seen by thousands of people over many years. We wanted to make something we could look back upon for those years to come and be proud of, meaning not only a high degree of quality and uniqueness to each image but a rewarding viewing experience. For us, NFTs aren't an object to be left sitting in a wallet, they're to be viewed, shared and enjoyed by many. We wanted to create something in which people could find new details with repeated views and references to 80s, 90s and 00s culture which may not be immediately apparent or understood.

One thing which the GOAT Tribe community is particularly proud of is the quality of our images. All images were drawn as vectors in Adobe Illustrator. A vector is an image produced without using pixels; they use equations, lines, and curves with fixed points on a grid whereas raster images are built from pixels. This means that a vector image can be increased in size without any pixelisation.

Of course, as our images needed to be in a readable format you will see some pixelisation at incredibly high resolutions, but the resultant quality of the image is far higher than that of a raster-based image.

The Algorithm

Starting with the background colour generation, Python's random function is used to generate three random integers, one each assigned to red, green & blue (RGB) to create a single colour combining the ascribed value of each. Each value is in the range 0 - 255, making 18,821,096 possibilities for this element alone (266^3). However, as the generation of this layer is completely random, no rarity weighting is ascribed to it.

The algorithm then proceeds to compile the layers of images, each grouped into a folder per layer to avoid clashes and group similar items (such as bodywear, headwear, etc.). Each image is an individual .png file in its own right on a completely transparent background, ensuring that preceding layers are visible in the finished piece.

For the original collection, the layers were ordered as follows: breed; face art; neck art; body art; bodywear; eyes; eyewear; headwear; mouth and facial hair; ear piercings; and other piercings.

The selection of items from each layer by the algorithm is completely random. However, via the inclusion of duplicates of certain assets we are able to ensure that some items are more commonly selected than others.

The algorithm then opens an attributes.csv file (created at the point of creation of the first image) and writes the name of the asset being created, assigned incrementally (i.e. 'GOAT Tribe 00001' and so on), and the filename of each item selected, creating a record of each image and simplifying the metadata production process. Having all of this information present for all images in one spreadsheet also allows us to easily hard-code the percentage of each trait into the metadata.

The final stage in the process saves the compiled image as a single .png file with the assigned file name.

Last updated