A Billion Birds Fly

Where the birds come from.

A Billion Birds Fly runs the same engine as 1000 Flowers Bloom: the colour matching, the tiling and the browser-side rendering are all described in that write-up, and none of it changes here. This is about the other half — the 196 photographs it draws with, and why choosing them is the part that decides whether a mosaic works.

What a tile has to do

Two jobs at once

Every tile in a mosaic is doing two things simultaneously, for two different viewers. From across the room it is a single patch of colour — one pixel of a much larger picture, and nothing more. From arm's length it is a photograph, and it has to survive being looked at directly.

Those jobs pull against each other. The first only cares about a tile's average colour, which is one number per channel. The second cares about everything else: what is in the frame, whether it is sharp, whether it reads as a thing at all. A tile can have exactly the right average colour and still be useless, because up close it turns out to be a patch of out-of-focus leaves.

Which means the palette cannot be assembled by looking at colour. Colour is the easy half, and it is the half a computer can measure.

The curation problem

A photo library is not a palette

The obvious way to build a bird palette is to point a script at an archive of bird photographs and let it choose. The archive is right there, it is already sorted by rating and subject, and picking a few hundred frames out of a few thousand sounds like exactly the sort of thing software is for.

It is not, and the reason is worth stating plainly: a wildlife photograph is composed around its subject, not filled by it. A bird in a good photograph is small in the frame, deliberately, with space to fly into and habitat around it that tells you where you are. That composition is the photograph's whole intent. It is also precisely wrong for a tile — crop the middle of it and you get branches, water, or leaves.

A script can be taught to find the bird. It can measure sharpness, and in a long-lens photograph with the background thrown out of focus that genuinely locates the subject. It can weigh colour alongside sharpness, so it prefers a bird to a lit branch. It can run a trained subject detector and get a bounding box. Each of those is a real answer to a real question.

None of them answers the question that matters, which is not where is the bird but is this frame any good as a tile. That depends on things with no convenient measurement: whether the bird is doing something, whether the light is worth keeping at 128 pixels square, whether the frame still means anything once it has been reduced to a thumbnail among two hundred others. It is a judgement, and it is made once per photograph by the person who took it.

So the palette here is hand-picked and hand-cropped. Not selected from an archive by a scoring function, but chosen frame by frame and cropped square by the photographer, with the tile's job in mind rather than the photograph's. 196 of them.

The complete bird tile atlas: 196 bird photographs arranged in a 14 by 14 grid
The entire vocabulary. Every mosaic on the bird side of this site is spelled using only these 196 squares. There is no remainder square: 14 × 14 is exactly 196, so the grid comes out full. The flower atlas, at 195, has always carried one black corner.

What that buys

The numbers that follow

Hand-cropping does something a script cannot: it changes what the tiles are, not just which ones get picked. Every frame arrives already square — median short edge 4,870 px — so the build script never has to guess at a crop. It resizes to 128 px and packs, and that is the whole job.

196photographs in the palette
14 × 14atlas grid, no remainder
984 KBthe entire palette, one file

The palette also turns out to be measurably different from the flower one, in ways the page then has to accommodate:

 FlowersBirds
Tiles195196
Mean saturation0.3540.166
Mean luminance0.3880.512

Birds are about half as colourful as flowers, which is not a surprise — flowers evolved to be conspicuous and most birds evolved not to be. They are also considerably lighter, because a bird photograph is usually mostly water, sky or snow. So the decorative tiles drifting behind these pages are pushed hard on saturation and left alone on brightness: the flower layer has to be brightened to read against a dark page, and the bird layer already sits where the brightened flowers land.

The colour of the page

An accent taken from the tiles

The flower site's pink is drawn from its flowers. The blue on this side is drawn the same way, from a hue histogram of all 196 tiles: the largest single family sits at about 208 degrees — water and open sky — and accounts for 64 of them.

Rather than pick a blue by eye, the accent takes the flower pink's own saturation and value and moves only the hue. Both accents are therefore the same colour in every respect except the one that distinguishes them, which is why the two sites feel related rather than merely adjacent.

Making the pieces

Rendering off the browser

Everything a visitor makes here is built in their own browser, which caps how large a single image can get — around 180 megapixels in Chrome, 64 in Safari, and far less on a phone. The other write-up goes into why.

The gallery pieces are not made that way. They come from the same matching code run locally, which has no such ceiling, at 300 tiles across with 64 pixels per tile — between 60,000 and 90,000 tiles each, up to 294 megapixels. That is beyond what any browser here could allocate, and it runs in a couple of minutes.

Choosing the close-up

Crop where the mosaic has to work

Each gallery piece shows a small crop beside it, so you can see what the thing is actually made of. Choosing where to take that crop turns out to have a rule, and it is not the obvious one.

The instinct is to crop the subject — the wasp, the owl's face, the centre of the flower. That reliably produces the dullest possible card, because a subject is usually one colour. Crop the wasp and you get two hundred navy tiles. Crop the middle of a lily and you get a flat yellow disc.

The interesting crop is at a boundary, where the mosaic is forced to change its mind — pale milkweed flowers meeting the dark of the insect, a petal edge against open water. That is where you can see the palette being spent, one tile at a time.

A mosaic of a wasp on white milkweed, seen whole A close crop of the same mosaic, showing the individual bird photographs where the pale flowers meet the dark wasp
Whole, and close up. The crop on the right is taken at the edge of the wasp rather than on it. Ninety thousand tiles went into this one, and not one of them is a wasp.