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
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
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.
What that buys
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.
The palette also turns out to be measurably different from the flower one, in ways the page then has to accommodate:
| Flowers | Birds | |
|---|---|---|
| Tiles | 195 | 196 |
| Mean saturation | 0.354 | 0.166 |
| Mean luminance | 0.388 | 0.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
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
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
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.