Image to Forza Horizon 6 Vinyl Group generator and importer.
v1.8.4 · Windows · Forza Horizon 6 · GPU/OpenCL · One-file EXE
Convert PNG/JPG/BMP images into Forza Horizon 6 Vinyl Group layers. The app handles generation, preview, and import in one desktop window; normal users do not need Python, .venv, batch files, or manual memory addresses.
Download the EXE: get
forza-painter-fh6-v1.8.4.exefrom Releases and run it directly.
Preset Market: browse shared images, presets, and JSON packages at https://painter6.com or use the new in-app market banner.
If the result looks blurry: raise
Random samplesfirst. Values above 200000 usually make a major quality difference; higher values are clearer but take much longer to generate.
Import can take time: v1.4.1+ tries multiple FH6 template locators and can spend up to 5 minutes finding the safe layer table. Keep FH6 in Vinyl Group Editor, do not switch menus, and export a detailed log if it still fails.
| What it does | Details |
|---|---|
| Generate JSON | Convert images into geometry JSON with the bundled GPU/OpenCL generator. |
| Preview output | Show source and generated geometry previews inside the app. |
| Import to FH6 | Import JSON into the currently open FH6 Vinyl Group Editor. |
| Safe FH6 workflow | Auto-locate and verify the editable layer table before writing. |
| Full-shape import/export | Experimental type-code import on the Import page and current-group export on the Export page. |
| Preset Market | Open https://painter6.com from the app to browse shared images, presets, and JSON packages. |
| Update check | Check for new versions on startup and show changelog notes when available. |
- Download
forza-painter-fh6-v1.8.4.exefrom Releases. - Put the EXE in a normal writable folder, for example
Desktop\forza-painter-fh6. - Double-click the EXE. For FH6 import, run it as administrator if Windows blocks process access.
- In FH6, open
Create Vinyl Group/Vinyl Group Editor, load a sphere template, thenUngroupit. - In the app, generate JSON, open the
Importpage, enter the exact template layer count, then import.
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
Generate JSONpage. - Click
Add imagesand choose PNG/JPG/BMP images. - Select a quality preset.
- Optional: enable
Use custom settingsto change output layers, resolution, random samples, and mutated samples. - Click the fixed bottom
Start generatingbutton. - Wait for the preview and logs to update.
Generated files are saved beside the source image, for example image.500.json, image.1000.json, and image.3000.json.
One image can generate multiple checkpoint JSON files. Prefer the highest-layer JSON that matches your template; for example, use image.3000.json or the final image.json with a 3000-layer template. Importing a 500-layer JSON into a 3000-layer template will look blurry.
| Preset | Output layers | Random samples | Use case |
|---|---|---|---|
| extremely fast | 500 | 30000 | Quick composition checks |
| fast | 1000 | 60000 | Quick usable drafts |
| balanced | 1800 | 120000 | Recommended default |
| slow | 2500 | 220000 | Final quality; starts using the 200k+ quality range |
| super slow | 3000 | 350000 | Best clarity, very slow |
- Start FH6 and keep
Vinyl Group Editoropen. - Load or create a template made from many simple sphere layers.
Ungroupthe template and remember the exact in-game layer count.- In the app, open
Import, clickRefresh, and selectforzahorizon6.exe. - Enter the exact template layer count.
- Add the generated
.json, or clickUse generated JSON. - Leave advanced address fields empty and click
Import JSON.
FH needs 4 extra boundary layers to save the cover and apply bounds correctly. Example: a 1000-layer JSON should use at least a 1004-layer template; a 3000-layer template can import about 2996 drawable shapes.
v1.8.1 adds a new Region Paint tab for iterative region-focused painting; v1.8.0 adds FH6 type-code JSON research support directly to the main workflow: import full-shape/type-code JSONs from the Import page, and export the current editable FH6 group from the Export page.
Use this only for full-shape JSONs. Normal generated ellipse JSON should still use the regular Import page.
- Export is read-only and validates the editable FH6 layer table before writing JSON.
- Import auto-detects full-shape/type-code JSONs from the normal JSON list and expects a saved/reopened plain white circle template, usually 3000 layers, ungrouped before import.
- Supported full-shape JSON markers include
type_word,shape_word, FH6 full type codes, Kloudy/Fabric handmade JSON fields, font-shape fields, and simple primitive names likeCircle,Square,Triangle, andEllipse. - Type-code JSON previews use bundled FH6 vinyl vertex resources, so multi-shape JSONs from the new exporter and Kloudy/Fabric-style handmade JSONs can be previewed without rectangle fallbacks.
- Mask layers are previewed as transparent cutouts against already drawn lower layers; FH6 UI thumbnails may still show the mask shape itself.
- After full-shape import, save and reopen the vinyl group before judging the result; FH6 can keep showing stale live template resources in the current editor.
- If full-shape import/export fails, the app shows a direct reminder for the important FH6/editor/template checks. Use
Export full-shape reportonly when you need to send debug data. - The importer writes only stable visual fields and the 16-bit shape word at layer offset
0x7A. - It does not copy volatile FH6 resource pointers such as
0xA8. - After import completes, save and reload the FH6 vinyl group before judging stale UI thumbnails.
Region Paint is an iterative painting workflow that generates a base layer pass across the whole image, then lets you select regions (using Rectangle or Ellipse tools) and refine only those areas with additional layers.
- Add a single image, choose a Quality Profile (which sets the Total budget from
stopAt), and adjust First-pass and Region layers. - Click
Start First Passto generate base layers. A preview appears on the right canvas. - Use the Rectangle or Ellipse tool on the left canvas to draw a selection region. The red overlay shows your selection.
- Click
Paint Selected Regionto add more layers only inside that region. Repeat for each area. - After all passes, use
Open Result FolderorSave Result JSONto get the finalbase.json. - Import the result JSON using the
Importtab — same workflow as standard generation. - The remaining budget is shown next to
Remaining. Each region pass consumes layers from this budget.
- The FH6 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 FH6, reloading the template, or changing layer count, import again with the new correct count.
- If JSON has fewer layers than the template, unused template layers are hidden.
- If JSON has more layers than the template, extra shapes are trimmed.
- Transparent PNG backgrounds are not imported as visible backgrounds.
The one-file EXE extracts its internal files temporarily and stores normal runtime data outside the EXE. The app shows the exact paths in the startup log.
Expected external folders beside the EXE:
runtime/: logs, generated session data, and temporary app files.webui-data/: local browser/UI cache.
These folders can be deleted when the app is closed if you want to reset local runtime data.
- EXE will not import into FH6: close the app and run the EXE as administrator.
- GPU/OpenCL error: update NVIDIA/AMD/Intel graphics drivers. 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 the menu was not changed during scanning.
- Imported result is blurry: use a higher-layer JSON or increase
Output layers/Random samples. - Need help debugging: use
Export detailed login the app and attach the log to an issue.
- Import walkthrough video: https://www.bilibili.com/video/BV1hG5Z6nENZ
- Preset Market: https://painter6.com
- Bundled GPU generator source/reference: https://github.com/zjl88858/forza-painter-geometrize-gpu
- Full changelog: CHANGELOG.md
Only versioned release entries are kept here. See CHANGELOG.md for the app update prompt changelog.
- Region Paint selection shapes now support drag to move, corner resize, and rotation (slider, scroll wheel, entry box, or on-canvas handle).
- Added a recommended preset that delivers great quality with relatively low compute power.
- Added a Heatmap tab to the Region Paint canvas, showing shape density across the generated image with a colour-scale bar. The heatmap is automatically generated after each pass and cached for instant tab switching.
- Significantly improved Region Paint preview image generation speed.
- Removed the Feather control from Region Paint's Step 3 selection tools. Selection masks are now always hard-edged (0 feather) to fix issues with the Paint Selected Region feature.
- Added Region Paint — a new iterative painting workflow. Generate a base layer pass across the whole image, then select regions (using Rectangle or Ellipse tools) and refine only those areas with additional layers. Includes layer budget management, pass history, live preview canvas, and result JSON export.
- Fixed the UI log area at the bottom of the window being partially hidden behind Notebook tabs.
- Updated the app version to
v1.8.0; release packages now useforza-painter-fh6-v1.8.0.exe. - Added experimental full-shape import/export flow: full-shape import lives on the
Importpage, and current-group export lives on theExportpage. - Full-shape import/export uses the 16-bit shape word at layer offset
0x7Aand avoids volatile resource pointers such as0xA8. - Included Kloudy's FH6 Painter custom-importer attribution, font-shape registry, and FH6 vinyl resource data for type-code JSON support and previews.
- Updated the app version to
v1.7.0; release packages now useforza-painter-fh6-v1.7.0.exe. - Added a prominent Preset Market banner to the Generate, Import, Tools, and Tutorial pages.
- The new market button opens https://painter6.com so users can browse shared images, presets, and JSON packages directly from the app.
- Updated the app version to
v1.6.8; release packages now useforza-painter-fh6-v1.6.8.exe. - Kept float ellipse width/height from the latest GitHub
mainchanges, improving in-game import accuracy. - Added a preview-panel note that v1.6.8 prioritizes better in-game output while previews remain approximate.
- Improved JSON preview rendering with supersampling to reduce float-sized ellipse preview degradation.
- Updated the app version to
v1.6.7; release packages now useforza-painter-fh6-v1.6.7.exe. - Updated the bundled GPU generator to upstream
canary-26052702. - Replaced FH6 import scale magic numbers with named constants for the circle and rectangle base sizes.
- Improved generation ETA estimation for buffered generator output and changing generation speed.
- Updated the app version to
v1.6.6; release packages now useforza-painter-fh6-v1.6.6.exe. - Added Traditional Chinese UI translations and improved the language selector layout.
- Fixed
luma_bandpreprocessing for RGB images, made preprocessed-image writes safer, and added tests for geometry/color data handling. - Packaged OpenCV and NumPy into the one-file EXE so
luma_bandpreprocessing works in release builds. - Import now requires the FH6 template layer count before starting.
- Refactored core modules with typed exceptions and shared utility helpers.
- Updated the app version to
v1.6.5; release packages now useforza-painter-fh6-v1.6.5.exe. - Updated the bundled GPU generator to upstream
v1.2-Canary-20260525. - Bundled presets now set
forceOpaqueShapes = falseby default. - Reduced main-app overhead during generation by using a sanitized generator environment, slower file polling, and less frequent preview writes in the heaviest preset.
- Fixed generated output tracking when preprocessing creates a separate input image.
- Updated the app version to
v1.6.1; release packages now useforza-painter-fh6-v1.6.1.exe. - Disabled
luma_bandpreprocessing by default in bundled presets. - Import no longer reuses stale FH6 session data from
webui-data; it re-locates the current template before writing. - JSON previews now use one stable renderer path to avoid ellipse preview distortion differences between packaged EXE environments.
- Updated the app version to
v1.6.0; release packages now useforza-painter-fh6-v1.6.0.exe. - Updated the bundled GPU generator to upstream
canary-26052401. - Added upstream
errorGridSizepreset support. - Integrated the upstream transparent-area overhang prevention algorithm adjustment.
- Significantly improved generation quality for the large ellipse at the bottom of transparent images.
- Fixed preview scaling for high-resolution source images, generator preview PNGs, and JSON previews so the full image fits the current preview panel without stretching.
- Fixed type 16 rotated ellipse rendering in JSON previews so Import page previews no longer flatten or rotate ellipse strokes incorrectly.
- Added EXE-friendly custom preset import, image/JSON list removal, checkpoint reuse, safer output naming, and Pillow preview fallback.
- Added a true one-file EXE so normal users no longer need Python,
.venv, or helper files. - The GUI EXE can relaunch itself in hidden helper mode for import and FH6 memory probing.
- The Tools page and startup log now show external runtime/cache locations.
- Fixed startup dependency installation when a project
.venvexists but its Python does not havepip. - Improved startup-script diagnostics for incomplete source-package extraction.
- Updated the bundled GPU/OpenCL generator to upstream
canary-26052102. - Added the upstream work-group evaluation algorithm from PR #4 for faster GPU candidate evaluation.
- Added startup update checking, root
CHANGELOG.md, and the dark desktop UI.
- FH6 template auto-location now tries both v1.3 and v1.4 scan strategies before giving up.
- Added an RTTI vtable fallback locator and increased the auto-location wait budget.
- Added detailed log export capped at 50000 characters.
- Improved FH6 template auto-location for large writable memory regions.
- Updated the bundled GPU/OpenCL generator to upstream
canary-26052101. - Added the upstream GPU device-selection fix and selected-device logging.
- Updated the bundled GPU/OpenCL generator to upstream
canary-26052001. - Added
forceOpaqueShapes = trueto bundled and custom generation settings.
- Added centralized version management for the app window, CLI, and release package names.
- Reorganized the repository layout and release packaging.




