Image to text converter
Read the printed text out of a photo, screenshot or scan and download it as a .txt file, or as JSON with the position and confidence of every block.
Drop your files here
.jpg, .jpeg, .png, .webp, .bmp, .gif, .avif · up to 100 MB
More settingsFewer settings
How to Extract Text
- 1
Add your image
JPG, PNG, WebP, BMP, GIF or AVIF, up to 20 files. The format is read from the file itself, so a wrong extension still lands in the right decoder.
- 2
Pick the language of the text
One language is enough for most scans; add a second or third when a page genuinely mixes them. Each extra language costs a download and a little accuracy.
- 3
Click Extract and download the .txt
You get the recognised text, the character count and the average confidence. Switch the output to JSON when you need coordinates as well.
What OCR in a browser can and cannot read
This is Tesseract, the same engine behind most open-source OCR, compiled to WebAssembly and run inside your tab. It is strong on printed text: book pages, screenshots, invoices, signs, forms, anything set in a normal typeface at a reasonable size. It is weak on handwriting, on heavily stylised display type, on text laid over busy photographs, and on anything photographed at an angle. Resolution matters more than file size: a crisp 1500-pixel-wide screenshot of a paragraph reads better than a ten-megapixel phone photo of the same paragraph taken from across a room. If the average confidence comes back under 30 the tool tells you it found nothing readable rather than handing you a page of plausible-looking nonsense.
The preprocess switch, and when it helps
With preprocessing on, the image is converted to greyscale and then thresholded with Otsu's method, which picks the black-and-white cut-off from the image's own histogram rather than a fixed number. That is a large win on photographed pages with uneven lighting, on faint receipts and on grey scans, because it removes the shading that the recogniser would otherwise try to interpret. It is a loss on text that is already clean, on light-on-dark screenshots, and on anything with coloured text on a coloured background, where a hard threshold can erase the letters entirely. Try it when the plain run disappoints you, not before.
Text, or text with coordinates
The default output is a plain .txt with the same line breaks the engine saw. The JSON option instead gives you an array of blocks, each with its recognised text, its confidence, and a bounding box as four numbers: x, y, width and height in pixels of the image that was actually recognised. That is what you want for highlighting results back over the original, for pulling one field out of a form, or for checking which part of the page dragged the average confidence down.
Neither the image nor the text is uploaded
The recognition engine and the language data are downloaded once and then cached by your browser, and everything after that runs locally: your image is decoded in the tab, recognised in the tab, and the text file is built in the tab. Nothing about the content is sent anywhere, which matters when the thing you are reading is a contract, a payslip or an ID.
Frequently asked questions
Which languages are supported?
English, Russian, German, French, Spanish, Simplified Chinese, Arabic and Japanese. You can combine up to three at once for genuinely mixed pages, though a single correct language is almost always more accurate than two.
Is my image sent to a server?
No. The OCR engine is WebAssembly running inside your browser. The only network traffic is the one-time download of the engine and of the language data you picked; the picture and the recognised text stay on your device.
Why is the first run so much slower?
Because the first run downloads the engine, around 3 MB, plus the data for your language, between 0.7 and 3 MB depending on which one. Your browser caches both, so the second run starts recognising immediately.
Does it read handwriting?
Not reliably. The models here are trained on printed type, and handwriting comes back either wrong or below the confidence threshold. Very neat block capitals sometimes work; ordinary cursive does not. Treat any handwritten result as a draft to be checked, never as a transcription.
What do I do when no text is found?
First turn on the preprocess option and try again; it fixes most uneven-lighting cases. If that does not help, the usual cause is resolution: rescan or re-photograph so that the letters are at least twenty pixels tall. Cropping down to just the text and picking the matching language also help more than people expect.
What resolution do I need for a good result?
Aim for text roughly 20 to 40 pixels tall, which is about 300 DPI for a normal document scan. Below that, letters start merging and accuracy falls off sharply. Above it, you mostly pay in time: an image is not more readable for being 10000 pixels wide, and anything over 12000 pixels on a side is scaled down before recognition anyway.
Can I get the position of each word?
You get the position of each block, which is the unit the engine reports: its text, its confidence and its bounding box in pixels. Choose the JSON output instead of plain text and the download is that array rather than a flat file.
Does it work on a phone?
Yes, with two caveats. The first run has to download several megabytes over whatever connection you are on, and recognition on a phone takes roughly three times as long as on a laptop, so a full-page scan can take half a minute. Everything still runs locally.