Joins scrolling screenshots from Uma Musume into one tall image, so you can share a full spark, skill, or inheritance list in a single picture. This version is adapted for the English release of the game.
Live site: https://sandwaves.github.io/Uma-Stitcher/
Everything runs in your browser. Nothing is uploaded, there's no server, and there are no analytics.
- Add your screenshots with Choose screenshots, by dragging them onto the page, or by pasting with Ctrl+V. Click a thumbnail to see it full-size, or its × to remove it.
- Click Stitch screenshots. The stitched image appears below after a few seconds.
- Save it with Save PNG or Save JPG, or use Copy image.
- Include the top section (name, stats and tabs) keeps the fixed top part of the screen above the stitched list. Untick it to get only the list.
- Add skill icons to sparks (beta) reads skill names with OCR and adds the matching icon next to each one. Names are fuzzy-matched against the skill dictionary, so small OCR mistakes still get the right icon.
- The theme toggle in the top-right switches between light and dark, and remembers your choice.
- Each screenshot should overlap the previous one by at least two rows of content.
- Take every screenshot the same way, with the same device, orientation, and window size.
- On PC/Steam, capture only the game window with Alt+Print Screen, and don't crop the images. The tool needs the panel to be in the same place in every frame.
- Keep mouse cursors, notifications, and overlays out of the shots.
- Screenshots are matched by where they overlap, so their order usually doesn't matter. Any that can't be matched are stacked in the numbered thumbnail order; use the ‹ › buttons (or drag on desktop) to change it.
There's no build step. Serve the project folder over HTTP:
python -m http.server 8000
Then open http://localhost:8000. Opening index.html directly works in
most browsers, but OpenCV's wasm, clipboard paste, and the Tesseract worker
are more reliable over HTTP.
After editing, this catches syntax errors:
node --check js/base.js js/receipt_factor.js
.
├── index.html # main page
├── css/
│ ├── base.css # UI styles and light/dark themes
│ ├── common.css # small shared rules (image, .hidden)
│ └── reset.css # Eric Meyer reset
├── js/
│ ├── base.js # UI wiring, drag/drop, lightbox, theme toggle, generatePhoto
│ ├── receipt_factor.js # the stitching pipeline (OpenCV.js)
│ ├── dict_skills.js # English skill name → icon ID dictionary
│ ├── regexps.js # OCR text cleanup rules
│ ├── race_factors.js # JP race names (reference only, not used by the app)
│ ├── shortcut.js # global keyboard shortcut helper
│ └── opencv.js # bundled OpenCV.js
└── img/
├── tmpl_*.png # JP UI templates for layout detection
├── skill_icons/ # icons for the skill-icon option
└── ...
This is the third project in a chain of forks (see Credits). The page's Update history section has the full versioned list; Ver4.01 onwards covers this line of forks.
- OCR uses the Tesseract English model instead of Japanese.
dict_skills.jsis keyed by English skill names, and the missing English skill icons have been added.regexps.jsnow does light English cleanup: whitespace, quotes,○/◎/×marker fixes, and common OCR confusions.- Skill names snap to the closest dictionary entry by Levenshtein distance. The aptitude marker must still match exactly.
- A skill with no icon shows the "unknown" icon instead of throwing an error.
- The upstream Google Analytics tag is removed, and the site metadata and links point to this repo.
- All UI text, error messages, and instructions are in English. The race data and UI templates still use Japanese matching keys.
- A new, cleaner UI with a light/dark theme.
- Reset happens in place, without reloading the page, so OpenCV, Tesseract, and the icons stay cached.
- Drag-to-reorder thumbnails and a full-size lightbox preview.
- Memory fixes: several Mat lifecycle leaks closed, a use-after-free fixed, and double-frees removed.
- Speed fixes: bulk pixel reads via
mat.datainstead of per-pixelucharAtloops, cached template Mats, and a cached Tesseract worker so the OCR model loads once per session. - Stricter PC/Steam matching: a tighter panel crop, less noise-sensitive diff masks, stricter overlap checks, and a minimum overlap size that rejects false header-only matches.
- Screenshots that can't be matched keep your order instead of being moved to the end.
- Overlapping content is drawn once; each image only paints the part below what's already on the canvas.
Nearly all of the stitching pipeline and UI come from these two projects:
- lt900ed/receipt_factor by lt900ed: the original tool, for the Japanese version of the game.
- daftuyda/Stitcher: the English UI, rewritten interface, robustness fixes, and PC/Steam support.
Also used:
- Skill icons and data from U-tools.
- OpenCV.js and Tesseract.js, both bundled.
- The loading spinner from SpinKit (
sk-fading-circle).
The upstream repo has no license file, so neither does this one. Treat it as source-available for personal use.