What 1.4.5 requires
If the technologies being used can achieve the visual presentation, text is used to convey information rather than images of text except for the following:
- Customizable
- The image of text can be visually customized to the user's requirements;
- Essential
- A particular presentation of text is essential to the information being conveyed.
Note Logotypes (text that is part of a logo or brand name) are considered essential.
People with low vision, reading difficulties or trouble tracking lines change how text looks: a larger size, another font, other colors, more space between lines. Real text follows those settings. A picture of text does not, and it blurs when it is enlarged. Understanding 1.4.5 asks authors who can reach the look they want with text and CSS to use text.
An image of text is text rendered as a picture for a visual effect. Text that is part of a picture with significant other visual content, such as a graph, a screenshot or a diagram, is not one. Logotypes are allowed, as is text whose exact look is the point, such as a type sample or an old letter, and an image of text the user can customize.
When the same text is also on the page as real text, 1.4.5 is met. The stricter 1.4.9, at Level AAA, allows images of text only as pure decoration or where their look is essential. The picture still needs a text alternative, which is 1.1.1.
ACT rules for 1.4.5
Common failures
Under each example: what axe-core and Rampa reported on the markup before the fix, in a run with Gemma 4 12B on 9 October 2026.
A heading drawn as a picture
The section heading is a picture of italic serif words. Someone who enlarges text or swaps the font for one they read better gets the same small picture, blurred when zoomed. A web font and a few lines of CSS give the same look.
Before, fails 1.4.5
<h2>
<img src="our-story.svg" alt="Our story"
width="360" height="90">
</h2>After, passes
<h2 class="story-title">Our story</h2>- axe-core
Passes:
image-altfinds an alt, and no rule looks at what the picture shows.- Rampa
✗ html > body > main > section > h2 > img The image shows the text "Our story" as a picture; use real text styled with CSS. Evidence: "Our story" Patch: - <img src="our-story.svg" alt="Our story" width="360" height="90"> + <span>Our story</span> confidence high · 1/1 runs · evidence verified · id 6b341ea6bf56The patch puts the words in place of the picture, inside the same
h2. The look comes back with CSS, which the patch does not write.
A promotion that is all text
The offer is the whole banner: two lines of text on a colored background, with a few coffee beans in a corner. The alt repeats the words, which serves 1.1.1, but the words still cannot be enlarged or restyled.
Before, fails 1.4.5
<img src="free-delivery.svg"
alt="Free delivery on every order over £30"
width="600" height="140">After, passes
<p class="promo">
<strong>Free delivery</strong>
on every order over £30
</p>- axe-core
Passes:
image-altfinds an alt.- Rampa
✗ html > body > main > img The image shows the text "FREE DELIVERY on every order over £30" as a picture; use real text styled with CSS. Evidence: "FREE DELIVERY on every order over £30" Patch: - <img src="free-delivery.svg" alt="Free delivery on every order over £30" width="600" height="140"> + <span>FREE DELIVERY on every order over £30</span> confidence high · 1/1 runs · evidence verified · id 478d1c24a780
An image button with a word on it
The subscribe button is a picture of the word “Subscribe”. A button with text looks the same with CSS and follows the user’s text settings.
Before, fails 1.4.5
<input type="image" src="subscribe.svg"
alt="Subscribe" width="160" height="52">After, passes
<button type="submit">Subscribe</button>- axe-core
Passes:
input-image-altfinds an alt.- Rampa
✗ html > body > main > form > input:nth-of-type(2) The image shows the text "Subscribe" as a picture; use real text styled with CSS. Evidence: "Subscribe" Patch: - <input type="image" src="subscribe.svg" alt="Subscribe" width="160" height="52"> + <button type="submit">Subscribe</button> confidence high · 1/1 runs · evidence verified · id 9c87e0d94440
What axe-core checks
axe-core 4.14.0 has no rule for 1.4.5. Whether a picture is mostly text is a question about pixels, and axe-core reads markup and styles. The rules mapped to 1.1.1, such as image-alt and input-image-alt, check that a picture has a text alternative, which says nothing about whether it should have been text.
A heading, a promotion or a button drawn as a picture passes every axe-core rule, as long as it has an alternative.
What Rampa judges, and how
What goes to the model
Nothing, unless 1.4.5 is asked for with --criteria. Then every rendered picture larger than an icon, more than 40 px on a side: img, image buttons, named canvas, elements with role="img" and no text of their own, and CSS background images, captured with the element’s own content hidden so only the picture is judged. Inline SVG is left out, since its text is real text, and so is any picture whose alternative, file name, id or class says it is a logo.
What the model sees
- The picture as it renders on the page.
- How it is drawn (an
img, an image button, a canvas, a CSS background orrole="img") and its rendered size. - Its text alternative and its file name.
- The name of the link or button it belongs to.
- The visible text of the closest container around it. Alternatives are left out, since nobody sees them.
What it must answer
What the picture shows, in one sentence; every word of text in it, transcribed exactly, as evidence; the exception that applies (no text, text that is incidental to a photo, chart or screenshot, a logotype, an essential look, a symbol, or decoration) or none; a verdict and a confidence.
What drops a claim
- A fail transcribes fewer than three letters: a lone character or a pair of initials is a symbol or a monogram, like the Understanding document’s “B” for bold.
- A fail names an exception, or a pass names none.
- A descriptive alternative, of three content words or more, shares no word with the transcription, so one of them describes another picture.
- The alternative or the file name calls the picture a screenshot, chart, diagram, graph or map.
- The same words are shown as real text next to the picture, which the Understanding document says meets the criterion.
- The transcription runs over 600 characters, too long to be the text of one picture.
The patch
Replaces an img with a span holding its text, and an image button with a button; the look comes back with CSS. Backgrounds and canvas get no patch: the text goes in by hand.
For every criterion
- Page content reaches the model marked as data, and the prompt tells it to ignore any instruction inside.
- Answers are cached by a hash of the prompt, the image, the model and its settings, so the same input never calls a model twice.
--runs 3asks three times and keeps the majority; when runs disagree, confidence drops. Findings below--min-confidence(medium by default) are hidden, and--verboselists them.- Claims dropped by verification are counted in every report, never shown as findings.
How Rampa was measured on it
| Set | Tests | Cases | axe-core, precision / recall | Rampa, precision / recall / F1 |
|---|---|---|---|---|
| 1.4.5, image contains no text (ACT 0va7u6) | meaning | 15 | not defined, nothing flagged / 0.00 | 1.00 / 0.60 / 0.75 |
Corrupted pairs: Rampa told 4 of 4 apart (text pictured as an image), axe-core 0. A pair is a passing test page and a copy broken on purpose; a checker that gives both the same verdict is not judging.
Run on 9 October 2026: axe-core 4.14.0, Gemma 4 12B on a local GPU, reasoning off, one run, ACT test cases a9a1483e. Small samples and one run: read the numbers as a working pipeline, not as a result.
Read with these caveats
- On ACT rule 0va7u6, Rampa found 3 of 5 failures with no false positive. One miss is a deliberate disagreement: the test case shows “Welcome” as an image above the paragraph “Welcome to our website”, which ACT counts as a failure and the Understanding document as met. The other is a model error: plain text “WCAG Rocks” read as a logotype.
- The prompt was revised after reading the errors of earlier runs on these cases, without copying test pages into it. Read the numbers as a working pipeline, not as a result.
Limitations
- It is off by default. It adds a vision call for every picture larger than an icon, on top of the image work 1.1.1 already does, and whether a banner that pairs a product photo with a headline is an image of text is a call people still disagree on.
- Banners that pair a product photo with an offer or a headline are reported when the text dominates. Teams that read them as pictures with significant other content can waive the finding.
- The transcription is the model’s reading and can slip on fine print.
- On real pages it reported slogan and title graphics on mozilla.org and carousel banners on kabum.com.br, and nothing on 17 photos on BBC News or on the screenshots of a GitHub Docs page.
- It needs a model with vision, as 1.1.1 does.
Questions about 1.4.5
Is a logo with text an image of text?
It is, but WCAG allows it: logotypes, text that is part of a logo or brand name, are considered essential. Rampa skips any picture whose alternative, file name, id or class says it is a logo, and the model can also answer that the text is a logotype.
Is an image of text fine if its alt repeats the text?
For 1.1.1, yes. For 1.4.5, no: screen readers read the alt, but people who enlarge or restyle text still see a fixed picture. 1.4.5 is met when the same text is also on screen as real text.
Does a banner with a product photo and a headline fail 1.4.5?
It depends, and people disagree. Text that is part of a picture with significant other visual content is not an image of text. Rampa reports such a banner when the text dominates; if your team reads it as a picture, waive the finding with a reason.
Why does Rampa not check 1.4.5 by default?
It adds a vision call for every picture larger than an icon, which doubles the image work 1.1.1 already does, and the line between an image of text and a picture with text in it is still disputed. Run it with --criteria 1.4.5, or add it to a list of criteria.
Can axe-core find images of text?
No. No axe-core rule is mapped to 1.4.5: reading the words in a picture takes vision.
Check your pages
Rampa is not on npm yet. Clone it and run it from source with Node.js 22.12 or newer and Chrome or Edge. 1.4.5 never runs unless asked for: --criteria 1.4.5 judges only this criterion, and a list such as --criteria 1.1.1,1.4.5 adds it to others.
With Ollama running, Rampa picks a local model by itself; node dist/cli.mjs doctor says what is missing.
git clone https://github.com/guilhermebsantiago/rampa-cli.git
cd rampa-cli
pnpm install && pnpm build
node dist/cli.mjs check https://example.com --criteria 1.4.5Checked against rampa-cli (commit 0459809) and the W3C sources on 9 October 2026.