A high-performance Chrome side panel extension and standalone web application for discovering, analyzing, converting, and exporting images from any webpage.
Maintained by Shakib Khan (
@ichshakib)
- Overview
- Screenshots
- Key Features
- How It Works
- Project Architecture
- Tech Stack
- Installation & Setup
- Usage Guide
- Available Scripts
- Troubleshooting
- Contributing
- Code of Conduct
- Contact
- License
Pixel is an image asset extractor that empowers designers, developers, content creators, and researchers to discover, filter, convert, and download images from any webpage.
Operating entirely locally inside your browser, Pixel scans the full DOM tree—including encapsulated Shadow DOM components—and presents assets in a multi-column interface inside Chrome's native Side Panel. Additionally, it injects a right-click "Save Image As" context menu supporting conversion to PNG, JPG, WebP, JFIF, GIF, and PDF.
| 🌙 Dark Mode | ☀️ Light Mode |
|---|---|
- Multi-Source Scraping: Scans
<img>,<picture>sources, SVG<image>tags, and CSS inline background images. - Recursive Shadow DOM Traversal: Dives through open Shadow Roots to extract encapsulated images within custom web components.
- Normalization & Deduplication: Resolves relative URLs to absolute paths and deduplicates identical assets automatically.
- Lazy Load Detection: Detects lazy-loaded images across common data attributes (
data-src,data-lazy-src,data-original, etc.).
- Accordion Control: Clean, expandable filter bar with active indicators and one-click reset.
- Sorting Modes: Sort by File Size, Width, Height, Total Dimensions (Area), or MIME Type.
- Sort Order: Instant toggle between Ascending and Descending sequences.
- Targeted Filtering: Filter by exact pixel resolutions or specific image formats (
PNG,JPEG,WEBP,GIF,SVG).
- Right-click any image on any webpage to convert and save it on the fly:
- Save as PNG (.png) — Lossless transparent output.
- Save as JPG (.jpg) — Standard JPEG with clean background fill for transparent areas.
- Save as WebP (.webp) — Modern WebP compression.
- Save as JFIF (.jfif) — JPEG File Interchange Format.
- Save as GIF (.gif) — Preserves animated GIFs or encodes 256-color palette GIFs.
- Save as PDF (.pdf) — Single-page PDF document embedding the image at native resolution.
- Save in Original Format — Downloads the source asset as-is.
- Copy Image Address — Copies the URL directly to your clipboard.
- Extract All Images on Page... — Opens the Pixel side panel immediately.
- Multi-select images individually or use the Select All toggle.
- Bulk ZIP Download: Compresses all selected images into a single ZIP archive using JSZip with automatic file deduplication and naming.
- Data Export: Export full image metadata (URLs, alt text, dimensions, file size, MIME type) as CSV or JSON.
- Built without heavyweight UI frameworks (zero Tailwind CSS, zero shadcn).
- Device Theme Adaptation: Automatically reacts to system theme changes via
@media (prefers-color-scheme: dark). - Features frosted glass floating action bars, shimmer loading skeletons, and accessible status indicators.
All extraction, analysis, and format conversion logic runs entirely on your local machine. Pixel does not send your browsing history, page contents, or extracted images to any external server.
sequenceDiagram
actor User
participant SidePanel as Side Panel (React 19)
participant Background as Service Worker
participant Tab as Active Webpage
Note over User,SidePanel: Extraction Flow
User->>SidePanel: Click Extension Icon / Open Side Panel
SidePanel->>Background: Request Tab Image Discovery
Background->>Tab: Send Message (extractImages)
Tab->>Tab: Walk DOM & Recursive Shadow Roots
Tab->>Tab: Normalize & Deduplicate URLs
Tab-->>SidePanel: Return Image Array
SidePanel->>SidePanel: Parallel Metadata Fetching (HEAD requests)
SidePanel->>User: Display Interactive Image Grid
Note over User,Background: Right-Click Context Menu Flow
User->>Tab: Right-Click Image -> "Save as PNG / JPG / PDF"
Background->>Background: Fetch Image & Render via OffscreenCanvas
Background->>Background: Convert Format (PNG/JPG/WebP/GIF/PDF)
Background->>User: Trigger Download via chrome.downloads
pixel-image-extractor/
├── assets/ # Project branding and demo screenshot assets
│ ├── extension_demos/ # Side panel preview screenshots (dark.png, light.png)
│ └── logo.svg # Vector brand logo
├── chrome-extension/ # Manifest V3 Chrome Extension
│ ├── public/
│ │ ├── extension_demos/ # Side panel preview screenshots (dark.png, light.png)
│ │ ├── icons/ # Extension icon set (16, 32, 48, 128)
│ │ └── logo.svg # Vector brand logo
│ ├── src/
│ │ ├── background/ # Background Service Worker
│ │ │ ├── index.ts # Service worker entry & lifecycle
│ │ │ ├── contextMenus.ts # Right-click context menus setup & routing
│ │ │ └── imageDownloader.ts # Format conversion & download pipeline
│ │ ├── content/
│ │ │ └── main.tsx # Content script (DOM & Shadow DOM scanner)
│ │ ├── sidepanel/ # Side Panel Application
│ │ │ ├── components/ # UI Components (Header, FilterBar, ImageCard, etc.)
│ │ │ ├── services/ # Extraction & metadata services
│ │ │ ├── store/ # Zustand store & filter calculations
│ │ │ ├── index.css # Pure Vanilla CSS design system
│ │ │ ├── App.tsx # Main application layout
│ │ │ └── main.tsx # React mounting entry point
│ │ └── utils/
│ │ └── converters.ts # PDF 1.4 generator & GIF encoder
│ ├── manifest.config.ts # Chrome Manifest V3 configuration
│ ├── vite.config.ts # Vite + CRXJS build configuration
│ └── package.json # Extension dependencies & scripts
├── favicon_io/ # Web application favicon assets
├── index.html # Standalone landing page
├── landing.css # Landing page styling
├── script.js # Landing page interactions & scroll reveals
├── CONTRIBUTING.md # Contribution guidelines
├── CODE_OF_CONDUCT.md # Community standards & pledge
├── LICENSE # MIT License
└── README.md # Project documentation
| Component | Technology | Description |
|---|---|---|
| Architecture | Chrome Extension Manifest V3 | Service worker lifecycle, Side Panel API, declarative context menus |
| UI Framework | React 19 | High-efficiency component rendering in side panel |
| Language | TypeScript 5.9 | Strict type safety across all messages and modules |
| Build Tooling | Vite 8 + @crxjs/vite-plugin | Blazing fast HMR and bundle pipeline |
| Styling | Pure Vanilla CSS | Semantic variables, @media (prefers-color-scheme: dark), zero Tailwind |
| State Management | Zustand 5 | Lightweight, predictable client state |
| Archive Bundling | JSZip 3 | In-memory ZIP compression for bulk exports |
| GIF Encoding | omggif | 256-color palette quantization & GIF stream encoder |
| Iconography | lucide-react | Clean, accessible vector icons |
| Package Manager | pnpm | Fast, disk-space efficient package manager |
- Download the latest release archive: 👉 pixel-image-extractor-chrome-extension-1.0.2.zip (or download directly from the Official Website).
- Extract the ZIP file to a local directory on your computer.
- Open Google Chrome and navigate to
chrome://extensions/. - Enable Developer mode toggle in the top-right corner.
- Click Load unpacked and select the extracted folder.
- Pin Pixel to your Chrome toolbar and start extracting!
-
Clone the repository:
git clone https://github.com/ichshakib/pixel-image-extractor.git cd pixel-image-extractor -
Navigate to the extension directory and install dependencies:
cd chrome-extension pnpm install -
Build the production extension:
pnpm build
The compiled extension will be output to
chrome-extension/dist/, and a zipped distribution package will be placed inchrome-extension/release/. -
Load the extension in Chrome:
- Open Google Chrome and navigate to
chrome://extensions/. - Enable Developer mode in the upper-right corner.
- Click the Load unpacked button.
- Select the
chrome-extension/dist/directory. - Pin Pixel to your Chrome toolbar.
- Open Google Chrome and navigate to
For active development with Hot Module Replacement:
cd chrome-extension
pnpm devVite will watch for changes and automatically rebuild the files in dist/. Changes to the React side panel will update dynamically.
The repository includes a landing website at the root directory:
# Serve locally via Python
python -m http.server 3000
# Or via Node
npx serve -l 3000 .Then visit http://localhost:3000 in your web browser.
- Navigate to any website (e.g., Unsplash, Pinterest, or your own web application).
- Click the Pixel extension icon in your Chrome toolbar to open the Side Panel.
- Pixel will automatically detect and list all images found on the page.
- Filter & Sort:
- Click Advanced Filters & Sorting to expand the accordion.
- Select a sorting metric (File Size, Width, Height, Area, MIME Type).
- Filter by specific format (PNG, JPG, WebP, GIF, SVG) or minimum dimensions.
- Selection & Bulk Export:
- Click individual cards or use Select All.
- Click Download ZIP on the floating action bar to download the selected batch.
- Click CSV or JSON to export asset metadata.
- Right-click any image on any webpage.
- Expand the Pixel — Save Image As submenu.
- Choose your desired output format:
- Save as PNG — Preserves transparency.
- Save as JPG — Flattened format with white background.
- Save as WebP — Lightweight modern format.
- Save as JFIF — Standard JFIF file.
- Save as GIF — Quantized 256-color palette GIF.
- Save as PDF — Native resolution single-page document.
- Save in Original Format — Exact source file.
The following scripts can be executed inside the chrome-extension/ directory:
| Script | Command | Purpose |
|---|---|---|
dev |
pnpm dev |
Starts the Vite dev server with extension HMR |
build |
pnpm build |
Compiles TypeScript (tsc -b) and produces production bundles in dist/ |
preview |
pnpm preview |
Serves the built output locally for inspection |
- Chrome restricts extension side panels from running on internal browser pages (such as
chrome://extensions/,chrome://settings/, or the default New Tab page). Navigate to any standard HTTP/HTTPS webpage and try again.
- Some remote servers block direct
canvas.toBlob()extraction using strict CORS headers. Pixel handles this gracefully:- The background service worker first attempts a clean direct fetch.
- If blocked by CORS or page scope (e.g.,
blob:URLs), it automatically executes an in-tab helper to draw and export the image from the page's authenticated origin.
- If you edit
manifest.config.tsor background service worker files, openchrome://extensions/and click the Reload icon on the Pixel extension card to reinitialize the extension worker.
- When converting transparent PNGs or WebP files to JPG or PDF, transparent pixels are automatically composited onto a clean white background
#ffffffto prevent black artifacts.
We welcome contributions of all kinds! Please read our CONTRIBUTING.md for development guidelines, coding conventions, and pull request procedures.
This project is dedicated to providing a welcoming, harassment-free experience for everyone. Please review our CODE_OF_CONDUCT.md before participating.
- Author & Maintainer: Shakib Khan (@ichshakib)
- Email: ichshakib@gmail.com
- GitHub Repository: github.com/ichshakib/pixel-image-extractor
- Issue Tracker: github.com/ichshakib/pixel-image-extractor/issues
This project is licensed under the MIT License. See the LICENSE file for details.