Fork of ScanSlicer (https://github.com/macrodev8/ScanSlicer), implementing a mirrored export patch.
Find a file
dan 607f5e0c57 feat: add explicit left/right orientation with swap button
Fixes mirrored slice exports by making orientation explicit:

- PhotoSlice.swapped flag persists a user left/right swap
- swap_left_right() mirrors [TL,TR,BR,BL] -> [TR,TL,BL,BR]
- normalize_top_left() honors the flag so squarize/reset_rotation
  no longer overwrite manual orientation
- Swap L/R toolbar button wired through canvas state + controller
- Color-code left (orange) vs right (cyan) corners and edges
2026-09-11 21:33:59 +02:00
docs chore: add AppImage release packaging 2026-03-04 14:59:01 +00:00
packaging/appimage chore: add AppImage release packaging 2026-03-04 14:59:01 +00:00
scanslicer feat: add explicit left/right orientation with swap button 2026-09-11 21:33:59 +02:00
.dockerignore chore: add repository ignore and container ignore rules 2026-02-18 10:15:00 +00:00
.env.example chore: add example environment variables for desktop runtime 2026-02-18 10:31:31 +00:00
.gitignore chore: fork setup — tidy ignores, untrack runtime state, add AGENTS.md 2026-09-11 20:23:00 +02:00
AGENTS.md feat: add explicit left/right orientation with swap button 2026-09-11 21:33:59 +02:00
docker-compose.yml build: add docker runtime files 2026-03-04 11:12:14 +00:00
Dockerfile build: add docker runtime files 2026-03-04 11:12:14 +00:00
LICENSE docs: add GPLv3 licensing and upstream attribution 2026-03-04 13:46:58 +00:00
pyproject.toml build: add pyproject metadata for setuptools packaging 2026-02-18 10:35:00 +00:00
README.md chore: add AppImage release packaging 2026-03-04 14:59:01 +00:00
setup.py build: add legacy setuptools shim entry point 2026-02-18 11:10:54 +00:00
THIRD_PARTY_NOTICES chore: add AppImage release packaging 2026-03-04 14:59:01 +00:00
uv.lock build: add uv lockfile for reproducible dependency resolution 2026-02-26 15:54:55 +00:00

ScanSlicer

ScanSlicer is a desktop Qt application for extracting multiple photos from a flatbed scan image. It detects photo regions, lets you correct boxes manually, then saves perspective-corrected crops.

Inspired by PhotoSlicer by Francesco Vannini.

This repository keeps GNU GPL v3 licensing for compatibility with that upstream work.

What It Does

  • Detects photo boxes from .png, .jpg, and .jpeg source images.
  • Supports threshold-based and Canny-based detection pipelines.
  • Provides manual correction tools (corner drag, edge drag, rotate, move, add/remove box).
  • Saves only locked boxes, each as a perspective-corrected output image.
  • Includes auto-tuning with feedback learning from your prior saved results.
  • Works on Linux desktops over Wayland or X11.

Requirements

  • Python >=3.10
  • Linux desktop session (for example KDE Plasma) over Wayland or X11
  • System libraries required by Qt/OpenCV (see Dockerfile for a known-good package set)

Project dependencies (from pyproject.toml):

  • PySide6
  • opencv-python
  • numpy
  • Pillow

Quick Start

Run with uv

uv sync --frozen
uv run scanslicer

Open a specific input directory at launch:

uv run scanslicer /path/to/scans

Choose backend explicitly:

uv run scanslicer --backend wayland
uv run scanslicer --backend x11

Run with Python directly

python -m scanslicer

CLI

scanslicer [path] [--backend {auto,wayland,x11}]
  • path: optional startup directory containing scan images.
  • --backend: display backend selection. auto is default.

Typical Workflow

  1. Open an input directory.
  2. Verify output directory (defaults to the opened input directory).
  3. Click Detect (or use auto detection triggered on image load).
  4. Adjust boxes as needed.
  5. Lock boxes you want to export (or use lock-all).
  6. Choose save format (jpg or png) and quality/compression.
  7. Click Save images.

Only locked boxes are exported.

Runtime Behavior

  • Detection and auto-tune run in background worker tasks (QThreadPool) so UI stays responsive.
  • Status events are written to a session log file and reflected in the status bar.
  • Detection results are cached (normal and filter preview) to avoid unnecessary re-processing when toggling filter preview.

Data and Config Files

Persistence paths depend on how ScanSlicer is run.

Non-container runs (uv run scanslicer, python -m scanslicer):

  • Defaults: ~/.config/scanslicer/defaults.json
  • Named presets: ~/.config/scanslicer/presets.json
  • Auto-tune feedback: ~/.config/scanslicer/autotune-feedback.json
  • Session status log: ~/.config/scanslicer/status.log

If XDG_CONFIG_HOME is set, these are stored under $XDG_CONFIG_HOME/scanslicer/ instead.

Container runs:

  • When running in container and /work exists, these are stored under /work/.scanslicer/.
  • In the provided docker-compose.yml, the current repository is mounted as /work, so these files appear in .scanslicer/ inside the project directory on the host.

Environment variable overrides:

  • SCANSLICER_DEFAULTS_PATH
  • SCANSLICER_PRESETS_PATH
  • SCANSLICER_FEEDBACK_PATH
  • SCANSLICER_STATUS_LOG_PATH

Docker Compose

The repo includes a GUI-oriented compose setup for Linux desktop use:

docker compose up --build

See .env.example and docker-compose.yml for required host UID/GID and Wayland/XDG settings.

AppImage Build

AppImage build scripts and recipe are in packaging/appimage/.

  • Local: bash packaging/appimage/build-appimage.sh
  • Dockerized build: bash packaging/appimage/build-appimage-docker.sh

Detailed instructions: docs/appimage.md.

Documentation

  • docs/README.md - documentation index
  • docs/user-guide.md - end-user operation guide
  • docs/architecture.md - code architecture and execution flow
  • docs/parameters.md - full detection parameter reference
  • docs/autotune.md - auto-tune and feedback internals
  • docs/runtime-config.md - backend/environment and persistence paths
  • docs/appimage.md - AppImage packaging details
  • docs/development.md - contributor-focused architecture/workflow notes

Repository Layout

scanslicer/                - Application source (UI, controllers, canvas, detection)
packaging/appimage/        - AppImage recipe and build scripts
Dockerfile                 - Runtime image
docker-compose.yml         - GUI container runtime wiring
pyproject.toml             - Python package metadata and dependencies