The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →“Convert an image to HTML” can mean two different jobs. If you already have an image file, you usually want to embed or preview that image in a page. If you have a screenshot and want editable buttons, text, and responsive layout, you want to recreate the design as HTML and CSS. JavaScript can handle file previews and canvas exports; it cannot automatically turn every pixel into semantic, maintainable markup.
This guide shows both workflows, explains data URLs and Blob URLs, covers CORS and canvas security, and gives a practical path from a screenshot to real HTML.
Choose the result you actually need
| Starting point | Desired result | Best method |
|---|---|---|
| Local image selected by a user | Show it in a page | FileReader.readAsDataURL() and <img> |
| Canvas pixels | Inline image in HTML | canvas.toDataURL() |
| Large canvas or downloadable output | Temporary image URL or file | canvas.toBlob() and URL.createObjectURL() |
| Screenshot of a design | Editable, responsive interface | Manually model structure in HTML/CSS, optionally assisted by vision-to-code tools |
An <img> element embeds pixels; it does not expose the words, controls, or layout inside those pixels to the browser. For accessibility and responsive behavior, recreate meaningful content with real elements.
Preview a local image with JavaScript
This complete example lets a user choose an image, then displays it without uploading the file to a server. readAsDataURL() reads a Blob or File and produces a data URL that can be assigned to an image source.
Free tools Windows power users keep installed
One-click scans. No signup required.
#1 Best Overall
<!doctype html>
<html lang="en">
<meta charset="utf-8">
<title>Image preview</title>
<label>Choose an image
<input id="file" type="file" accept="image/*">
</label>
<img id="preview" alt="Selected image preview" hidden>
<p id="status" role="status"></p>
<script>
const input = document.querySelector('#file');
const preview = document.querySelector('#preview');
const status = document.querySelector('#status');
input.addEventListener('change', () => {
const file = input.files[0];
if (!file) return;
if (!file.type.startsWith('image/')) {
status.textContent = 'Please choose an image file.';
return;
}
const reader = new FileReader();
reader.addEventListener('load', () => {
preview.src = reader.result;
preview.hidden = false;
status.textContent = `${file.name} (${Math.round(file.size / 1024)} KB)`;
});
reader.addEventListener('error', () => {
status.textContent = 'The file could not be read.';
});
reader.readAsDataURL(file);
});
</script>
</html>
The data URL contains the encoded image, so this preview works offline and needs no public URL. For production uploads, validate file type and size on the server as well; the browser’s accept attribute is only a selection hint.
Embed an existing image directly in HTML
If the image is already hosted, no conversion is needed:
<img src="/images/diagram.webp" alt="System architecture diagram" width="1200" height="700" loading="lazy">
Use descriptive alternative text when the image conveys information. If it is purely decorative, use an empty alt value. Keep the original image as an external URL when caching, compression, and a small document are more important than making one self-contained HTML file.
Export a canvas as an inline image
toDataURL() returns a data URL. PNG is the default; pass a supported MIME type and, for JPEG or WebP where supported, a quality value from 0 to 1.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Repair Windows errors before they cause bigger problems3Scan for outdated or missing drivers - takes under a minuteRank #2
const canvas = document.querySelector('canvas');
const dataUrl = canvas.toDataURL('image/png');
const result = document.querySelector('#result');
result.src = dataUrl;
result.alt = 'Exported canvas image';
A complete minimal page looks like this:
<canvas id="art" width="640" height="360"></canvas>
<img id="result" alt="Canvas export">
<script>
const canvas = document.querySelector('#art');
const ctx = canvas.getContext('2d');
ctx.fillStyle = '#17324d';
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'white';
ctx.font = '32px sans-serif';
ctx.fillText('Exported from canvas', 40, 190);
document.querySelector('#result').src = canvas.toDataURL('image/png');
</script>
Use a Blob URL for larger images
A data URL stores the complete encoded image in an in-memory JavaScript string. Large images can consume substantial memory and create unwieldy URLs. MDN generally recommends toBlob() with URL.createObjectURL() instead.
const canvas = document.querySelector('canvas');
canvas.toBlob((blob) => {
if (!blob) return;
const url = URL.createObjectURL(blob);
const img = document.querySelector('#result');
img.src = url;
img.addEventListener('load', () => URL.revokeObjectURL(url), { once: true });
}, 'image/png');
The Blob URL is temporary and normally exists only in the current document. Revoke it after the image has loaded, or when replacing it, to avoid accumulating references. Use toBlob for downloads, previews of high-resolution exports, and other outputs that do not need to be embedded permanently in the HTML source.
Handle cross-origin images and tainted canvases
If a canvas contains pixels loaded from another origin without an appropriate CORS response, the canvas becomes tainted. Reading pixels or calling toDataURL() or toBlob() then throws a security error. The fix must come from the image server: enable a suitable Access-Control-Allow-Origin response and set the image loading policy before assigning its source.
const image = new Image();
image.crossOrigin = 'anonymous';
image.onload = () => {
const canvas = document.querySelector('canvas');
canvas.width = image.naturalWidth;
canvas.height = image.naturalHeight;
canvas.getContext('2d').drawImage(image, 0, 0);
canvas.toBlob(blob => {
if (!blob) return;
document.querySelector('#result').src = URL.createObjectURL(blob);
}, 'image/png');
};
image.src = 'https://cdn.example.com/photo.jpg';
Setting crossOrigin in JavaScript cannot override a server that sends no CORS permission. Keep processing same-origin, proxy the asset through a server you control, or configure the CDN correctly.
What screenshot-to-HTML reconstruction involves
A screenshot has no DOM tree. To recreate it, inspect the visual hierarchy and write semantic elements such as <header>, <nav>, <main>, headings, lists, forms, and buttons. Then use CSS Grid or Flexbox for layout, responsive breakpoints for smaller viewports, and real text instead of text baked into the bitmap.
A practical reconstruction workflow
- Inventory the regions. Mark the header, navigation, hero, cards, controls, footer, and repeated components.
- Extract content. Transcribe visible text and identify images, icons, colors, spacing, and typography. Treat OCR as a draft that needs checking.
- Build semantic HTML. Give controls keyboard-accessible elements and useful labels; do not use a single background image for an interactive page.
- Match layout with CSS. Start with fluid widths, then add media queries only where the design actually changes.
- Compare at several viewport sizes. A pixel match at one screenshot width can still fail on phones, zoom, or long translations.
- Validate behavior. Test keyboard focus, contrast, alt text, reduced motion, and loading states.
Vision-language systems can generate an initial HTML/CSS draft from screenshots or sketches, but generated code still needs semantic, responsive, security, and accessibility review. The WebSight paper describes this as a distinct screenshot-to-code category, not as ordinary image embedding.
Which output should you choose?
| Output | Advantages | Trade-offs |
|---|---|---|
| External image URL | Small HTML, cacheable, easy to replace | Requires the URL to remain available |
| Data URL | Self-contained document; easy to assign to src |
Encoded string increases memory and document size |
| Blob URL | Efficient for large temporary images | Temporary; revoke it when finished |
| Recreated HTML/CSS | Editable text, responsive layout, accessible controls | Requires design analysis and implementation work |
Common failures and fixes
The preview stays blank
- Confirm
input.files[0]exists; the change event also fires when a user cancels in some workflows. - Check the FileReader error handler and the browser console.
- Ensure the selected file is an image and that the
srcassignment occurs after the reader’sloadevent.
SecurityError appears during canvas export
The canvas is tainted by a cross-origin resource. Configure CORS on the resource, use crossOrigin before src, or process a same-origin copy.
The exported image is unexpectedly PNG
The browser falls back to PNG when the requested canvas MIME type is unsupported. Check the resulting data URL or Blob type and choose a format the target browsers support.
Recommended Free Tools
Rank #4
The page becomes slow or crashes
Avoid converting very large canvases to data URLs. Prefer toBlob(), release old Blob URLs, and resize before export when full resolution is unnecessary.
The recreation looks right only at one width
Replace absolute pixel positioning with Grid or Flexbox, define flexible widths, and test intermediate widths rather than matching one screenshot by eye.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Or skip the browser setup
For a server-side screenshot that you can feed into a design-review or reconstruction workflow, ScreenshotNeo returns an image or PDF from one request. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be disabled. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status.
Use the API documentation at https://screenshotneo.com/docs/ for all options, including full-page captures with lazy images, CSS-selector elements, device and retina settings, custom CSS or JavaScript, waits, request blocking, headers, cookies, geolocation, PDF settings, caching, signed links, asynchronous webhooks, bulk capture, and usage data.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchcURL
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
Python
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
Node.js
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const buffer = Buffer.from(await res.arrayBuffer());
require('fs').writeFileSync('shot.webp', buffer);
ScreenshotNeo is a website screenshot API and MCP server for AI agents, including Claude and Cursor. The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account to get started.
Best Value
Frequently Asked Questions
Can JavaScript read text and buttons from a JPG automatically?
No. JavaScript can display or transform the pixels. Extracting structure requires OCR and design reconstruction, followed by human review of the generated HTML and CSS.
Should I use a data URL or a Blob URL?
Use a data URL for a small self-contained document. Prefer a Blob URL for larger temporary output, and revoke it after use.
Why does canvas export fail for an image that displays normally?
Displaying a cross-origin image is allowed, but exporting pixels from a canvas containing it requires a successful CORS response.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

