Notices, hours and menus saved as pictures cannot be resized or recolored. See when real text is required and the few exceptions that apply.
If the same visual result can be achieved with real text, use real text instead of an image of text. There are two exceptions. An image of text is fine if the user can customize it to their needs (font, size, color, background), or if that particular presentation is essential, as with a logotype.
A picture of words cannot be resized cleanly, recolored for high contrast, reflowed on a narrow screen, translated, searched, or read aloud with the same reliability as text. Alt text can pass the words to a screen reader, but it does nothing for the person who needs larger letters or different colors.
Public sites are full of images that were exported from a design tool or a word processor because it was the fastest way to publish: a closure notice, opening hours, a fee table, a flyer with a registration deadline. A resident who zooms in sees blurry pixels, and a visitor using a custom color scheme sees black text on a transparent background.
Scanned notices are a related case. If a scanned page is the only copy of a notice that residents need, the text in it is effectively locked inside the picture. See documents and PDFs for how this applies to files.
The alt text below holds the words, but the visitor cannot enlarge, recolor or reflow them, and a long block of alt text is a poor reading experience. Real markup keeps the structure.
<img src="library-hours.png"
alt="Main Library: Mon-Fri 9 to 8, Sat 10 to 5, Sun closed. Holiday closures apply."><h2>Main Library hours</h2>
<ul class="hours">
<li>Monday to Friday: 9 a.m. to 8 p.m.</li>
<li>Saturday: 10 a.m. to 5 p.m.</li>
<li>Sunday: closed</li>
</ul>
<p>Holiday closures apply.</p>Menu items that are images lock the label to one size and color, and they will not follow the visitor's text settings.
<a href="/permits"><img src="nav-permits.png" alt="Permits"></a>
<a href="/licenses"><img src="nav-licenses.png" alt="Licenses"></a><a class="nav-link" href="/permits">Permits</a>
<a class="nav-link" href="/licenses">Licenses</a>A common shortcut hides the text and shows an image of it. That is still an image of text, and it stops working as soon as images are off or colors are overridden. Style the real text instead.
h2.permit-title {
background: url("permit-title.png") no-repeat;
height: 60px;
text-indent: -9999px;
}h2.permit-title {
font-family: "Fraunces", Georgia, serif;
font-size: 2rem;
letter-spacing: 0.01em;
}Logos and brand names are exempt, and so are images where the exact appearance is essential, for example a typeface sample or a scanned historical letter. Give them a short text alternative with the name, for example alt="City of Riverton" rather than alt="seal". A photograph of a street sign inside a larger picture is also fine, because it is part of an image with significant other visual content.
The same applies to app screens. A promo banner exported as one bitmap fails to scale with the system text size.
// SwiftUI
Image("registration-banner")
.accessibilityLabel("Summer registration opens June 1")// SwiftUI
VStack(alignment: .leading) {
Text("Summer registration").font(.title2).bold()
Text("Opens June 1")
}// Jetpack Compose
Image(painterResource(R.drawable.registration_banner),
contentDescription = "Summer registration opens June 1")// Jetpack Compose
Column {
Text("Summer registration", style = MaterialTheme.typography.titleLarge)
Text("Opens June 1")
}Ship it when: