Free tools Windows power users keep installed
One-click scans. No signup required.
Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
To improve an html2canvas capture, first set scale deliberately—normally to window.devicePixelRatio—then verify that source images, fonts, and the page state are ready. If images are still soft, adjust canvas smoothing; if images are missing, fix CORS rather than increasing resolution; if the result is blank or cut off, reduce the capture area or scale and account for browser canvas limits. html2canvas reconstructs a picture from the DOM and CSS, so more pixels cannot make unsupported CSS or unavailable source data appear.
What actually improves quality
html2canvas does not copy the browser’s final composited pixels. It reads the DOM and styles it can interpret, then paints a canvas. The project documentation warns that the result “may not be 100% accurate to the real representation” because it is built from page information rather than being an actual screenshot. That distinction explains why a larger image can still look wrong.
- Output dimensions: controlled mainly by
scale, plus the element’s CSS width and height. - Resampling: controlled by smoothing options and the source element’s rendering settings.
- Source availability: controlled by image loading, CORS, and page readiness.
- Fidelity: limited by html2canvas’s CSS and DOM support.
- Capture size: limited by the browser’s maximum canvas dimensions and area.
Diagnose which of these is failing before changing settings. Increasing every option at once often produces a slower, blank, or truncated canvas without restoring missing detail.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Scan for outdated or missing drivers - takes under a minute3Clear out junk files and repair common Windows errorsSet an appropriate scale
The documented default for scale is window.devicePixelRatio. A CSS box that is 800 pixels wide with a scale of 2 becomes a canvas about 1,600 pixels wide. This gives text and vector edges more raster samples when the original output was undersampled; it does not create detail that was absent from a low-resolution source image.
#1 Best Overall
- 16MP Sensor: Captures detailed photos with a CMOS sensor for everyday shooting
- Optical Zoom: 4x optical zoom with a 27mm wide angle lens for flexible framing indoors or outdoors
- Full HD Video: Records 1080p video for travel clips, family moments, or simple vlogging
- Memory Support: Works with Class 10 SD, SDHC, or SDXC cards up to 512GB
- LCD Screen and Battery: 2.7in LCD screen with 2 AA alkaline batteries for convenient on-the-go use
const element = document.querySelector('#capture');
const scale = Math.min(window.devicePixelRatio || 1, 2);
const canvas = await html2canvas(element, {
scale,
useCORS: true,
backgroundColor: '#ffffff',
});
const blob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/png'));
if (!blob) throw new Error('The browser could not create an image blob');
Passing the device pixel ratio is a sensible starting point for screen-oriented output. A cap such as 2 is an application-level, memory-conscious choice, not an official html2canvas recommendation. Raise it only when the destination needs more pixels and the target browsers can handle the resulting canvas.
Check the real pixel dimensions
Do not judge quality from CSS dimensions alone. Inspect both values:
console.log({
cssWidth: element.getBoundingClientRect().width,
cssHeight: element.getBoundingClientRect().height,
canvasWidth: canvas.width,
canvasHeight: canvas.height,
});
If the canvas is only as large as the CSS box on a high-DPI display, it may look soft when enlarged. If it already has ample pixels, a higher scale will not fix blurry source artwork, unsupported CSS, or a tainted canvas.
Make images and fonts ready before capture
A capture can be technically sharp yet visibly wrong when it runs while images or web fonts are still loading. Wait for the relevant resources and for the layout to settle after those resources arrive. The exact readiness logic is application-specific, but a basic image wait can be useful:
async function waitForImages(root) {
const images = [...root.querySelectorAll('img')];
await Promise.all(images.map((img) => {
if (img.complete && img.naturalWidth > 0) return Promise.resolve();
return new Promise((resolve) => {
img.addEventListener('load', resolve, { once: true });
img.addEventListener('error', resolve, { once: true });
});
}));
}
const target = document.querySelector('#capture');
await waitForImages(target);
await document.fonts?.ready;
const canvas = await html2canvas(target, { scale: window.devicePixelRatio || 1 });
This prevents an avoidable capture of fallback fonts or empty image boxes. It cannot make a server refuse a cross-origin request, and it does not guarantee that every animation or application-driven update has finished. Freeze animations, complete data rendering, and capture a stable state when consistency matters.
Fix blurry resized images with smoothing settings
Canvas smoothing is enabled by default, and the documented imageSmoothingQuality hint defaults to low. These settings affect resampling; they do not change html2canvas’s DOM-reconstruction model.
Photographs and ordinary UI imagery
Use smoothing for photographs and images being scaled gradually. You can request a higher quality hint and ask html2canvas to apply canvas settings to images:
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Rank #2
- 16MP Sensor: Captures detailed photos with a CMOS sensor for everyday shooting
- Optical Zoom: 5x optical zoom with a 28mm wide angle lens for flexible framing indoors or outdoors
- Full HD Video: Records 1080p video for travel clips, family moments, or simple vlogging
- Memory Support: Works with Class 10 SD, SDHC, or SDXC cards up to 512GB
- LCD Screen and Battery: 2.7in LCD screen and a rechargeable lithium-ion battery for on-the-go use
const canvas = await html2canvas(document.querySelector('#capture'), {
scale: window.devicePixelRatio || 1,
imageSmoothingEnabled: true,
imageSmoothingQuality: 'high',
forceImageQuality: true,
});
forceImageQuality applies the canvas smoothing settings to images and ignores each element’s CSS image-rendering. It is not an enhancement algorithm: it cannot reconstruct detail lost by an undersized source.
Pixel art and deliberately hard edges
For pixel art, nearest-neighbour behavior is often preferable. Set the source element’s CSS image-rendering accordingly and avoid forcing a smoothing policy that overrides it:
.pixel-art {
image-rendering: pixelated;
}
Compare the output at its intended display size. A pixel-art image may look jagged when enlarged, while a photograph may look harsh when smoothing is disabled.
Understand CORS when images disappear
Missing images and export errors are usually an origin-policy problem, not a resolution problem. A canvas becomes tainted when it contains image data fetched from another origin without permission. Once tainted, browser APIs such as toDataURL() and toBlob() may fail.
Use CORS only with server cooperation
useCORS: true tells html2canvas to attempt a CORS-enabled image request. The image server must send a suitable Access-Control-Allow-Origin response header. The option does not bypass the same-origin policy.
const canvas = await html2canvas(target, {
useCORS: true,
scale: window.devicePixelRatio || 1,
});
Check the image request in browser developer tools. Confirm that the response includes an origin permitted by your page and that redirects do not remove the header. If you control neither origin, retrieve the asset through a controlled same-origin proxy that enforces safe URL and content-type rules. Do not treat allowTaint as an export workaround: it does not make a tainted canvas readable.
Other common image causes
- The image URL returned an error, redirect, login page, or HTML instead of an image.
- A lazy-loaded image was not requested before capture.
- The image was replaced by a framework after your readiness check.
- Referrer, authorization, or cookie requirements prevented the request.
Resolve the network and policy issue first; changing scale cannot restore an image that never reached the canvas.
Rank #3
- Latest Digital Camera Built-in Fill Light : This compact digital camera is paired with a powerful CMOS processor and image stabilization to help you take & record the most exciting moments in 44 MP quality images & FHD 1080P quality videos anywhere, anytime. Plus, there is also a built-in fill light to help you take high quality pictures even in low light&dark settings, making this the perfect camera for all indoors/outdoors situations.
- Long-Lasting Battery Life & 16X Digital Zoom :This point and shoot camera will retain its battery charge even after long use. The controls and functions are easy to operate making this the perfect choice for children, teens and younger. This kids camera supports 16x digital zoom, you can zoom in or out the subject by pressing the W/T button for taking still photos to zoom in or out on distant objects and capture all the details you need.
- Multifunctional & Portable Digital Camera: This cheap digital camera is slim enough to fit in your pocket. You'll easily be able to take it with you on all your indoor/outdoor activities and adventures and ideal for beginners, children and teenagers. This kids digital camera is equipped with 20 filters, anti-shaking, self-timer, continuous shooting, date stamp, time-lapse recording, smile capture, internal MIC and speaker (recording sound videos), great for your daily photography needs.
- WEBCAM & PAUSE FUNCTION : More than just a FHD 1080p digital camera, it also works as a webcam for video calls and vlogging. Connect the camera to the computer, press shutter and power button at the same time and the camera will automatically turn on webcam mode for all your video calling and live streaming needs. The pause function allows you to pause when seeing playback videos.
- A Must Have Photography Device : This digital camera with SD card made from high-quality materials, this retro camera is safe and durable. Perfect for all ages to develop & improve their photographic abilities and observation skills. Our dedicated and experienced 24/7 support team is available for all after purchase troubleshooting, questions and technical help.
Capture full content without truncation
html2canvas normally works from the visible layout. For content extending beyond the viewport, pass dimensions that match the target’s scrollable area:
const target = document.querySelector('#capture');
const width = target.scrollWidth;
const height = target.scrollHeight;
const canvas = await html2canvas(target, {
scale: Math.min(window.devicePixelRatio || 1, 2),
windowWidth: width,
windowHeight: height,
width,
height,
});
Explicit x, y, width, and height options can also limit a capture to a smaller region. Capturing only the needed element lowers memory use and reduces the chance of browser limits.
Canvas limits are finite
The html2canvas FAQ gives rough guides for current evergreen browsers, not guarantees for a particular build or device: Chrome/Chromium is listed at about 32,767 pixels per dimension and about 268 million pixels of total area; Firefox at about 32,767 pixels per dimension and about 472 million pixels of area; desktop Safari at about 32,767 pixels per dimension. iOS Safari limits are lower and depend on device RAM. The FAQ points to the canvas-size library for current platform tests.
When a canvas is blank, partial, or throws an allocation error, reduce scale, capture a smaller region, or split a long page into sections and stitch the resulting images in a separate process. Test the chosen strategy on the browsers and devices you support; approximate limits vary with memory, GPU, and browser version.
Know when html2canvas is the wrong capture method
Because html2canvas rebuilds pixels from DOM information, unsupported or partially supported CSS can differ even when dimensions are correct. Effects involving complex compositing, certain filters, browser chrome, video frames, plug-ins, or cross-origin content may not match what a user sees.
If exact browser pixels are the requirement, evaluate a native screenshot mechanism or browser automation. The html2canvas FAQ notes that major browsers expose native screenshot APIs in extension environments, including chrome.tabs.captureVisibleTab() for Chrome, Edge, and Opera and browser.tabs.captureVisibleTab() for Firefox. Those APIs have their own permissions and visible-tab constraints, so select them only when they fit your deployment.
Export format and memory choices
PNG is a good default for text, UI, and transparency. JPEG can be smaller for photographic content but introduces lossy compression; WebP support and encoding behavior depend on the browser and destination. Changing an encoding format or quality parameter does not increase the canvas’s pixel dimensions.
Rank #4
- 16MP Sensor: Captures detailed photos with a CMOS sensor for everyday shooting
- Optical Zoom: 5x optical zoom with a 28mm wide angle lens for flexible framing indoors or outdoors
- Full HD Video: Records 1080p video for travel clips, family moments, or simple vlogging
- Memory Support: Works with Class 10 SD, SDHC, or SDXC cards up to 512GB
- LCD Screen and Battery: 2.7in LCD screen and a rechargeable lithium-ion battery for on-the-go use
toBlob() avoids keeping a large base64 string in JavaScript memory and is convenient for uploads. toDataURL(), shown in official examples, is useful when an immediate data URL is required but can temporarily consume substantially more memory for large images.
const blob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/jpeg', 0.9));
const form = new FormData();
form.append('file', blob, 'capture.jpg');
await fetch('/upload', { method: 'POST', body: form });
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Troubleshooting by symptom
| Symptom | Likely cause | Fix |
|---|---|---|
| Everything is soft | Canvas has too few pixels for its CSS size | Inspect canvas.width; start with scale: window.devicePixelRatio and increase cautiously. |
| Only resized images look bad | Resampling policy or low-resolution source | Choose smoothing for photos, nearest-neighbour behavior for pixel art, and use a larger source asset. |
| Images are absent | CORS, failed request, or incomplete lazy loading | Wait for images, inspect network responses, and configure server CORS or a controlled proxy. |
toDataURL or toBlob fails |
Canvas is tainted | Remove unauthorized cross-origin pixels; allowTaint is not an export bypass. |
| Capture is blank or cut off | Canvas dimension/area limit or incorrect full-page dimensions | Set dimensions from scrollWidth/scrollHeight, lower scale, or split the capture. |
| Output differs from the page | Unsupported CSS or changing page state | Freeze state, inspect supported styles, or use a native screenshot method. |
Or skip the browser setup
When you need a server-side screenshot rather than a canvas reconstructed in a user’s browser, ScreenshotNeo provides a single HTTP request for PNG, JPEG, WebP, or PDF output. Before capture it accepts cookie/consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be disabled. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and whether it was billed.
Outdated 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 matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo documentation for the full parameter set. The API supports full-page captures with lazy images loaded, CSS-selector element captures, dark mode, device presets and arbitrary viewports, retina scale, PDF paper sizes and page ranges, custom CSS and JavaScript, clicks, selector or network-idle waits, request and resource blocking, headers, cookies, user agents, authorization, timezone and geolocation, transparent backgrounds, resizing, configurable caching, signed links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, usage data, and an OpenAPI specification. Parameter names used by other screenshot APIs also work, which can simplify migration.
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(`Screenshot failed: ${res.status}`);
const fs = await import('node:fs/promises');
await fs.writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));
ScreenshotNeo also has an MCP server with take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients. The Free plan includes 1,000 shots per month without a card; paid plans start at $5 for 3,000 shots, and every feature is available on every plan. Create a free ScreenshotNeo account.
Practical decision checklist
- Measure the element’s CSS and canvas pixel dimensions.
- Start with device-pixel-ratio scaling, then increase only within tested memory limits.
- Wait for images, fonts, data, and layout changes to finish.
- Choose smoothing based on the image type, not as a universal sharpness switch.
- Confirm CORS headers for every cross-origin image.
- Use scroll dimensions or a smaller region for full-content captures.
- Split oversized canvases and test on real target browsers.
- Switch to a native screenshot service or API when exact browser pixels matter.
Frequently Asked Questions
Does setting scale: 2 produce a 4K screenshot?
No. Output dimensions are the element’s CSS dimensions multiplied by scale, and browser canvas limits still apply. A multiplier does not guarantee a particular resolution or restore source detail.
Can useCORS: true bypass the same-origin policy?
No. The remote server must grant access with an appropriate CORS response header, or the resource must be obtained through a controlled proxy.
Recommended Free Tools
Which format is sharpest, PNG or JPEG?
Sharpness primarily comes from pixel dimensions and source fidelity. PNG is usually preferable for text and interfaces; JPEG can reduce photographic file size but is lossy.
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.

