February 7, 2026
Color wars, but make it nerdy
Show HN: A luma dependent chroma compression algorithm (image compression)
HN asks: brilliant color shrink or reinventing the wheel
TLDR: A developer pitched a color-from-brightness trick for smaller images. The top reaction: this already exists in AV1 video, igniting a novelty vs. explanation debate and calls for code, benchmarks, and tough real‑world tests—useful idea, but the crowd wants proof it beats known methods.
On Bits’n’Bites, a solo dev showed a way to shrink color data by predicting it from brightness (luma) in small image blocks—store just two numbers per block and reconstruct the color, promising “no visible artifacts” and “~0.5 bits per pixel.” Sounds slick, right? Cue the Hacker News chorus: “Wait, this already exists.” The loudest voice, ffworld, argued the technique is basically “chroma from luma” used in the AV1/AV2 video codecs, dropping a research link and the “this is in production” hammer. Suddenly the thread split into two camps: one cheering the write-up as a clear, fun explainer; the other calling it a repackaged classic.
Drama escalated with demands for code, benchmarks, and tests on nightmare scenes: saturated reds, skin tones, HDR highlights, and hard edges. Memes flew—“AV1 did it” became the day’s catchphrase, while others joked the parrots image proves you can compress birds, not egos. Supporters praised the variable block sizing and simple “color follows light” idea; skeptics wanted proof beyond parrots and graphs. The vibe: great explainer, questionable novelty, with commenters arguing whether fresh presentation counts as innovation. And yes, someone dropped the old TV line: color has followed brightness since the 1960s—so bring receipts, not just pretty pictures.
Key Points
- •The technique models chroma (Cr, Cb) as a linear function of luma (Y) on a per-block basis.
- •For a block (e.g., 16×16), a least squares fit produces C(Y) = a·Y + b, but the encoder stores chroma endpoints C1 and C2 at Ymin and Ymax instead of a and b.
- •During decompression, Ymin and Ymax are computed from the luma channel, and chroma is reconstructed using C(Y) = (Y – Ymin)·(C2 – C1)/(Ymax – Ymin) + C1.
- •Using 8 bits for each of C1 and C2, storage is 16 bits per chroma channel per block (32 bits total for Cr and Cb).
- •The approach aims to compress chroma to under 0.5 bits per pixel on average without visible artifacts, using variable block sizes to balance compression and accuracy.