Skip to content
All fingerprint checksRender & GPU

a canvas reads back the same through toDataURL and getImageData

Check id canvas-todataurl-vs-getimagedata

What an ordinary browser yields

Every channel identical between getImageData and the decoded PNG (severity: warn).

What a detector infers

toDataURL and getImageData are two exits from one canvas, and PNG is lossless, so decoding the data URL back into pixels has to reproduce what getImageData already returned, byte for byte. There is no reference image and no baseline anywhere in that statement - the canvas is compared only against itself. It exists alongside the other pixel rows because all of those read through getImageData, which means a farble applied ONLY to toDataURL leaves every one of them satisfied: the canvas really does contain what they asked for. And toDataURL is the surface most likely to be perturbed, because it is what fingerprinting scripts actually hash. Measured on a real browser: a toDataURL shim perturbing a single pixel passed canvas-tamper, canvas-flat-fill-uniform, canvas-subrect-consistency and worker-vs-main, and was caught only by an identity check noticing the patched native - behaviourally it was invisible. Stock reproduces all 4096 channels with zero differences; the shimmed canvas differed in two channels by one.

How to resolve it

toDataURL and getImageData read the same backing store and PNG encoding is lossless, so a round trip has to reproduce what getImageData returned. Perturbing only toDataURL leaves the pixel-level checks satisfied while the two exits disagree with each other. Farble both identically, or neither.

What is canvas fingerprinting?

Nearby checks in Render & GPU

See all 32 checks in Render & GPU
Who builds this test

Clearcote is a browser built for fingerprint coherence

It is a Chromium fork, maintained by the same people who wrote this reference. It ships as a compiled browser rather than as a stealth script injected into someone else's — which is a description of how it is built, and is not an argument about how it behaves on this check.

This audit takes no position on how Clearcote scores on Render & GPU checks, on this one, or anywhere else. It has no baseline corpus of other people's fingerprints to rank you against and no vendor scoreboard — nearly every check is self-referential, asking one browser the same question through two independent APIs and reporting whether both answers can be true at once. It runs identically on any browser, including ours. Run it on yours and read the result yourself.

See the other checks in Render & GPU — the family canvas-todataurl-vs-getimagedata belongs to.