Image to Forza Horizon Vinyl Group generator and importer.
v1.0.0 · Windows · Forza Horizon 5 / 6 · GPU/OpenCL · One-file EXE
Convert PNG/JPG/BMP images into Forza Horizon Vinyl Group layers. The app handles generation, preview, and import in one desktop window; end users do not need Python, Node, or manual memory addresses - just the EXE.
Download the EXE: get the latest
forza-painter-*.exefrom Releases and run it directly.
If the result looks blurry: raise
Random samplesfirst. Values above 200000 make a noticeable quality jump; higher values are crisper but take much longer to generate.
Import can take time: Forza Painter tries multiple template locators and may spend up to 5 minutes finding the safe layer table. Keep Forza in Vinyl Group Editor, do not switch menus, and export the activity log if it still fails.
| What it does | Details |
|---|---|
| Generate designs | Turn images into geometry files using the bundled GPU/OpenCL generator. |
| Preview output | Show source and generated geometry previews inside the app. |
| Import into Forza | Push a design into the currently open Vinyl Group Editor in FH5/FH6. |
| Safe workflow | Auto-locate and verify the editable layer table before writing anything. |
| Update check | Check for new versions on startup and link to the latest release page. |
- Download the latest
forza-painter-*.exefrom Releases. - Put the EXE in a normal writable folder, for example
Desktop/forza-painter. - Double-click the EXE. Run as administrator if Windows blocks process access.
- In Forza Horizon, open
Create Vinyl Group/Vinyl Group Editor, load a sphere template, thenUngroupit. - In the app, generate a design, open the
Importpage, enter the exact template layer count, then clickImport design.
Do not download GitHub's automatic Source code ZIP unless you are developing the project. Normal users only need the EXE.
|
App import page |
Template ready in FH6 |
|
Imported result |
Applied to car |
- Open the
Generatepage. - Click
Add imageand pick a PNG, JPG or BMP. - Choose a quality preset (see table below).
- Optional: turn on
Customto fine-tune layer count, resolution, and samples. - Click
Start generatingand wait for the preview to update.
Generated files are saved beside the source image as image.<layer>.json checkpoints (e.g. image.500.json, image.1000.json).
Pick the checkpoint that matches your in-game template. A 500-layer JSON in a 3000-layer template will look blurry; always prefer the highest-layer file that fits.
| Preset | Output layers | Random samples | Use case |
|---|---|---|---|
| Composition Check | 500 | 30,000 | Quick framing/color check |
| Quick Draft | 1,000 | 60,000 | Rough but usable result |
| Standard | 1,800 | 120,000 | Recommended default |
| Detailed | 2,500 | 220,000 | Cleaner shapes |
| High Detail | 3,000 | 350,000 | Near-max detail, slow |
| Reference Quality | 2,900 | 1,000,000 | Highest fidelity, very slow |
- Start Forza Horizon and keep
Create Vinyl Groupopen. - Load or create a template made from many simple sphere layers, then
Ungroupit. - In the app, open
Import, clickRefresh, and pickforzahorizon6.exe(orforzahorizon5.exe). - Enter the exact in-game template layer count.
- Click
Use last resultto grab the JSON you just generated, orAdd fileto pick one from disk. - Leave the advanced address fields empty and click
Import design.
Forza reserves 4 extra boundary layers for the cover/apply bounds. A 1,000-layer JSON needs at least a 1,004-layer template; a 3,000-layer template can hold ~2,996 drawable shapes.
- The in-game template must be ungrouped before import.
- The layer count in the app must exactly match the game.
- Do not switch game menus while importing.
- After restarting Forza, reloading the template, or changing layer count, import again with the new correct count.
- If the JSON has fewer layers than the template, unused template layers are hidden.
- If the JSON has more layers than the template, extra shapes are trimmed.
- Transparent PNG backgrounds are not imported as visible backgrounds.
Forza Painter keeps normal runtime data alongside the EXE in two folders. The app prints the exact paths to the activity log on startup and on the Tools page.
runtime/- logs, session data, and temporary files.webui-data/- local browser/UI cache.
Delete these folders when the app is closed to reset local runtime data.
- EXE will not import into the game: close the app and run the EXE as administrator.
- GPU/OpenCL error: update your NVIDIA/AMD/Intel graphics driver. The bundled generator uses OpenCL.
- Template cannot be located: confirm you are in Vinyl Group Editor, the template is ungrouped, the layer count is exact, and you did not switch menus during scanning.
- Imported result is blurry: use a higher-layer JSON, or raise
Output layers/Random samplesinCustom. - Need help debugging: use
Export login the app and attach the log to an issue.
You only need this section if you want to modify Forza Painter or build the EXE yourself. End users should just download the release EXE.
- Windows 10/11.
- Python 3.11+ - https://www.python.org/downloads
- Node.js 20+ - https://nodejs.org (only needed to rebuild the web UI).
- Optional: PyInstaller to build the one-file EXE - installed automatically by the build script.
git clone https://github.com/DuBistMutig/forza-painter.git
cd forza-painter
python -m venv .venv
python -m pip install --upgrade pip
pip install -r requirements.txt
cd webui
npm install
npm run build
cd ..The pip install --upgrade pip step is important on fresh Python installs - the default pip on Python 3.11 is old enough to fall back to legacy installers that don't work with some packages.
python src/app.pyThis opens the same GUI as the release EXE, served from webui/dist/.
- Edited Python in
src/-> just re-runpython src/app.py. - Edited anything in
webui/src/->cd webui && npm run build && cd ..before re-running. - Pulled changes that touch
webui/package.json-> runnpm installinsidewebui/again before building.
Requires the .venv/ from the Clone and install step above.
powershell -ExecutionPolicy Bypass -File scripts/make_exe_release.ps1The script rebuilds the web UI and runs PyInstaller, producing dist/forza-painter-v<version>.exe plus a ZIP package. End users only need that EXE.
- Import walkthrough video: https://www.bilibili.com/video/BV1hG5Z6nENZ
- Bundled GPU generator source/reference: https://github.com/zjl88858/forza-painter-geometrize-gpu
Forza Painter is a fork of bvzrays/forza-painter-fh6, which itself builds on forza-painter/forza-painter by AE (A-Dawg#0001). The bundled GPU generator is based on forza-painter-geometrize-gpu by 神龟. This fork rebuilds the desktop UI and packaging while keeping the original memory-import core intact.
All upstream components are MIT-licensed - see LICENSE for the full notices.