UNPKG

@rockshin/react-image-annotation

Version:

An image annotation tool for ai project that manual annotation for images, easy to use!

185 lines (151 loc) • 4.61 kB
# React Image annotation project based on [tldraw](https://tldraw.dev/) An image annotation tool for ai project that manual annotation for images, easy to use! > Big Thanks to [tldraw](https://tldraw.dev/) ! ## install npm ```bash npm install @rockshin/react-image-annotation tldraw ``` pnpm ```bash pnpm add @rockshin/react-image-annotation tldraw ``` ## Easy to use: Don't forget import styles `import 'tldraw/tldraw.css';` ## Basic Usage ```tsx import { ImageAnnotationEditor } from '@rockshin/react-image-annotation' import 'tldraw/tldraw.css' function App() { const images = [ { id: '1', src: 'https://example.com/image1.jpg', annotations: [], // Initial annotations (optional) }, ] const handleDone = ({ annotations, image }) => { console.log('Annotations:', annotations) console.log('Image:', image) } return ( <div style={{ width: '100%', height: '600px', position: 'relative' }}> <ImageAnnotationEditor images={images} onDone={handleDone} tools={{ eraser: { enabled: true }, text: { enabled: true }, }} /> </div> ) } ``` ## Advanced Usage ### Multiple Images with Initial Annotations ```tsx import { ImageAnnotationEditor } from '@rockshin/react-image-annotation' function AdvancedExample() { const images = [ { id: '1', src: 'https://example.com/image1.jpg', annotations: [ { id: 'anno1', x: 100, y: 100, width: 200, height: 150, rotation: 0, label: '1', timestamp: Date.now(), metadata: { color: 'red', createdBy: 'user1', modifiedAt: Date.now(), version: 1, tags: [], isVerified: false, }, }, ], }, { id: '2', src: 'https://example.com/image2.jpg', annotations: [], }, ] return ( <div style={{ width: '100%', height: '800px', position: 'relative' }}> <ImageAnnotationEditor images={images} initialImageIndex={0} tools={{ eraser: { enabled: true }, text: { enabled: true }, }} outputTriggerOn={{ created: true, // Trigger onDone when annotation is created changed: true, // Trigger onDone when annotation is modified deleted: true, // Trigger onDone when annotation is deleted navigated: false, // Trigger onDone when image is navigated }} onAnnotationCreated={({ image, annotation }) => { console.log('New annotation:', annotation) }} onAnnotationChange={({ image, annotation }) => { console.log('Modified annotation:', annotation) }} onAnnotationDeleted={({ image, annotation }) => { console.log('Deleted annotation:', annotation) }} onImageChange={({ index, image }) => { console.log('Current image:', index, image) }} onImageLoadError={error => { console.error('Image load error:', error) }} onDone={({ annotations, image }) => { console.log('Final annotations:', annotations) }} /> </div> ) } ``` ## Features - šŸŽÆ Auto-incrementing numbered annotations (1-999) - šŸ–¼ļø Multi-image support with navigation - šŸ”„ Automatic reuse of deleted annotation numbers - šŸŽØ Customizable toolbar with: - Rectangle tool - Text tool (optional) - Eraser tool (optional) - Hand tool for navigation - šŸ“Š Comprehensive event callbacks - šŸ–¼ļø Support for both URL and base64 image sources - šŸ”„ Automatic image fitting with aspect ratio preservation - ⚔ Real-time annotation updates - šŸ”’ Locked base image to prevent accidental movement ## Important Notes 1. Container Requirements: - Parent container must have `position: relative` - Explicit dimensions (width/height) are required 2. Image Handling: - Images automatically fit to viewport - Original aspect ratio is maintained - Base image is locked to prevent accidental movement 3. Annotation Limits: - Supports up to 999 numbered annotations per image - Numbers are automatically reused when annotations are deleted 4. Error Handling: - Built-in error handling for image loading - Retry mechanism for failed image loads - Navigation options during error states ## License - Same as [tldraw](https://tldraw.dev/) Keep working on for this project now >>> 🚧 Project under active development. Contributions welcome!