Skip to main content
L
Loopaloo
Buy Us a Coffee
All ToolsImage ProcessingAudio ProcessingVideo ProcessingDocument & TextPDF ToolsCSV & Data AnalysisConverters & EncodersWeb ToolsMath & ScienceGames
Guides & BlogAboutContact
Buy Us a Coffee
L
Loopaloo

Free online tools for developers, designers, and content creators. Your files are processed in your browser and are never uploaded - no accounts required. A few network utilities (like What's My IP and Currency Converter) call public APIs to do their job and say so on their pages.

support@loopaloo.com

Tool Categories

  • Image Tools
  • Audio Tools
  • Video Tools
  • Document & Text
  • PDF Tools
  • CSV & Data
  • Converters
  • Web Tools
  • Math & Science
  • Games

Company

  • About Us
  • Contact
  • Blog
  • FAQ

Legal

  • Privacy Policy
  • Terms of Service
  • Disclaimer

Support

Buy Us a Coffee

© 2026 Loopaloo. All rights reserved. Built with privacy in mind.

Privacy|Terms|Disclaimer
  1. Home
  2. Image Processing
  3. Image Annotator
Add to favorites

Image Annotator

Mark a picture up with arrows, shapes, text and freehand, in the picture's own pixels: an annotation is the same size in the file whatever the view is zoomed to.

Edits stay in your browserMore image processingJump to full guide

Initializing in your browser…

You might also like

Image Diff Comparator

Compare two images with a perceptual engine (pixelmatch) that ignores anti-aliasing, or an exact byte engine. Groups changes into regions with bounding boxes, reports SSIM, and handles size mismatches with an explicit policy.

Meme Generator

Caption a picture with text that is measured, wrapped and kept inside the frame. The preview canvas is the exported file, pixel for pixel.

Image to Base64

Turn an image into a data URL whose payload is decoded again and compared byte for byte with the file, with the media type taken from the file's own signature rather than its extension and the size cost of embedding stated in full.

Image Annotator: a worked example

A rectangle dragged from (100, 80) to (400, 300) of a 1200 by 800 picture, which the tool shows at 74.67 percent.

Input

1200 x 800 picture · rectangle tool · stroke 4 px
What Image Annotator produces

What the exported file has

                        before     after
ink box x            98 to 405  97 to 402
ink box y            78 to 304  77 to 301
stroke ink, at 75%       8 px       6 px
stroke ink, at 125%      8 px       6 px
a 4 px stroke is                        
really, in the file    7.2 px     4.0 px

The placement was already right, which is worth saying. What was not is the size: the stroke width was divided by the display scale when the shape was made and multiplied by it again on export, so a 4 px stroke put 7.2 px in the file and the number moved with the zoom. The canvas now works in the picture’s own coordinates with the zoom in the viewport transform, so an annotation is the same size in the file whatever you are looking at.

About the Image Annotator

Mark a picture up with arrows, circles, text, shapes and freehand, every one of them an object you can move, restyle or delete. The annotations live in the picture’s own pixels, so a stroke width means the same number of file pixels whatever the view is zoomed to.

How to use

  1. 1Upload the picture you want to annotate
  2. 2Pick a tool: arrow, line, rectangle, circle, triangle, star, polygon, freehand, text or highlight
  3. 3Drag on the picture to place the annotation
  4. 4Re-select anything to move, resize, restyle, duplicate or delete it
  5. 5Zoom in for precision; the annotations do not change size in the file
  6. 6Choose PNG, JPEG or WebP and download

Where this helps

  • Bug reports

    Mark up screenshots to show exactly where an issue occurs.

  • Tutorial creation

    Add arrows and labels to screenshots for how-to guides.

  • Design feedback

    Annotate mockups with comments and change requests.

  • Documentation

    Label interface elements at a stroke width that means the same thing in every file.

Key features

  • Annotations measured in the picture’s own pixels, unaffected by the zoom
  • Thirteen tools, every mark an editable object
  • An export drawn once and synchronously, so no annotation can be dropped
  • Arrowheads grouped with their line, so an arrow moves as one thing
  • Object-based eraser that never touches the picture
  • Undo and redo up to 50 states, committed only when a draw completes
  • PNG, JPEG and WebP, with the format read back off the produced bytes
  • The size, format, byte count and annotation count of the last download reported
  • Single-key tool shortcuts and the usual undo, redo and duplicate keys

Tips & best practices

  • Zoom freely. The annotations are in the picture’s own pixels, so a 4 px stroke is 4 px of the file whether you are looking at 25 percent or 300.
  • Hold off on downloading until you are done: every arrow, shape and text box stays an editable object, and the download flattens them into the file.
  • Use the Highlight tool (a 0.3-opacity fill in the stroke colour) to mark an area, and the object-based Eraser to remove one annotation with a click without touching the picture.
  • Learn the single-key shortcuts (R rectangle, C circle, A arrow, L line, P pen, T text, V select, H pan) plus Ctrl+Z, Ctrl+Shift+Z and Ctrl+D.
  • The line under the export says what the file is: its size, its real format read off the bytes, its byte count and how many annotations went into it.

Examples

  • Marking up a screenshot for documentation

    Press A for the Arrow tool and drag from a caption toward a button; the tool draws a line and a grouped triangular head in your stroke colour. Switch to Rectangle (R) with no fill to box a region, then press T and click to drop editable labels. The download composites everything at the picture’s full resolution.

  • A 4 px stroke that stays 4 px

    On a 1200 by 800 picture shown at 74.67 percent, a rectangle dragged from (100, 80) to (400, 300) exports with its ink from x 97 to 402 and its stroke 4 px wide. Zoom to 125 percent and export again: the same numbers. Before this pass the same stroke was 7.2 px of the file and changed with the view.

How it works

The Image Annotator is built on Fabric.js v6 and treats every mark as an independent vector object rather than baking it into the picture. What changed in this pass is the coordinate system underneath all of them.

**An annotation is now measured in the PICTURE’s pixels.** The canvas previously worked in DISPLAY pixels: it was created at the picture’s size times the fit-to-container scale, every stroke width was divided by that scale on the way in, and the export multiplied by it again on the way out. A stroke of 4 therefore put 7.2 px in the file at the tool’s own default view of a 1200 by 800 picture, measured as 8 px of ink against the 6 a 4 px stroke really covers, and the number moved with the zoom. Zooming also rescaled every object’s left, top and scale, so the coordinates in the undo history belonged to whichever zoom they were recorded at. The canvas now works in the picture’s coordinates with the zoom in Fabric’s viewport transform: nothing about an annotation changes when you zoom, the stroke width is the number on the control, and the panel reports every annotation’s box in the picture’s own pixels.

**The placement was already right, and that is worth recording.** Measured before any change, a rectangle dragged from (100, 80) to (400, 300) of a 1200 by 800 picture landed at x 98 to 405 and y 78 to 304 in the exported file, which is the drag plus its stroke. The pass could then go to the size, which was not.

**The export is drawn once and synchronously.** It used to render each object to a data URL, assign it to an `Image`, and read the export canvas back on a fixed 100 ms `setTimeout`: anything whose `onload` had not fired by then was simply missing from the file and nothing said so. `FabricObject.render(ctx)` is what the canvas itself calls, so drawing the objects onto a plain context at the picture’s own size needs no timer and cannot drop one. Twelve annotations in one file are asserted in the test suite by counting the edges in the produced PNG.

Thirteen tools are available: Select, Pan, Arrow, Line, Rectangle, Circle (a Fabric Ellipse), Triangle, Star, Polygon, Freehand, Text, Highlight and Eraser. Each shape stays a live object, so it can be re-selected, dragged, resized, rotated, duplicated (Ctrl+D, offset by 20 px), flipped and reordered before export. The Arrow tool draws a line during the drag and appends a triangular head of `max(15, strokeWidth * 3)` on mouse-up, grouping the two. Star and Polygon are generated at a base radius of 50 and scaled during the drag. Highlight is a filled rectangle in the stroke colour at 0.3 opacity. Text is Fabric’s inline-editable IText. The Eraser is object-based: clicking an annotation removes that object and never touches the picture.

Undo and redo keep up to 50 states, serialised with `toDatalessJSON`, committed only when a draw completes so a partial 1 by 1 shape is never recorded. A shape’s cached corner coordinates are now refreshed as it is dragged, which they were not: selection hit-testing and every reading of a shape’s bounding box were of the 1 by 1 it had been created as. The canvas zooms from 25 to 300 percent, and the export is PNG, JPEG or WebP with the type read back off the produced bytes and the size, format and annotation count reported. Everything runs in the browser and the picture is never uploaded.

Frequently asked questions

Does zooming change the annotations?

No, and that is the point of this version. The zoom is a property of the view, not of the drawing: an annotation keeps its position, its size and its stroke width in the picture’s own pixels. Before this pass the stroke width was divided by the display scale and multiplied by it again on export, so a 4 px stroke put 7.2 px in the file.

Can I move annotations after placing them?

Yes. Each one is a separate object that can be dragged, resized, rotated, restyled and deleted at any time before you download.

Is there a limit to the number of annotations?

No practical limit, and none of them can be lost on the way out: the export draws every object synchronously rather than waiting a fixed 100 ms for images to decode, which is what the previous version did.

What formats can I export?

PNG, JPEG and WebP, at the picture’s own resolution. The type is read back off the produced bytes and the extension comes from what the file actually is.

Can I annotate without an uploaded image?

The tool is for annotating an existing picture. For drawing on a blank canvas, use the Drawing Canvas.

Related tools and how they differ

  • Image Pixelator: Applies a whole-image mosaic with square, circle, diamond, or hex tiles plus palette reduction for retro art or casual censoring; mosaic is partially reversible, so for true redaction draw a solid filled box instead.
  • Meme Generator: Places captions measured, wrapped and kept inside the frame; use it for shareable meme text, not precise markup objects.
  • Screenshot Beautifier: Adds a colored background, padding, shadow and browser or phone frames around an image; use it for presentation polish, not for arrows or callouts.

Private by design

Images are decoded, edited, and exported entirely inside this browser tab. No originals, exports, or metadata are uploaded.