A cross-platform desktop studio for preparing, splitting, cleaning, animating, and exporting 2D sprite assets.
Current Version: 2.0.0
Built with Python, PySide6 (Qt), Pillow, and Python-Markdown.
UZKHJ Sprite Studio is designed for game developers, artists, and anyone working with sprites, sprite sheets, sprite atlases, transparent images, or AI-generated game assets who wants a visual desktop workflow for common sprite-production tasks.
The Studio currently combines three coordinated production tools:
- Sprite Splitter
- Background Remover
- Sprite Animator
The tools share the same working image so a sprite can be cleaned, detected, precisely cropped, animated, previewed, and exported without leaving the application.
The screenshots below show the current UZKHJ Sprite Studio workflow, beginning with Sprite Splitter, followed by Background Remover and Sprite Animator.
Automatic sprite detection, visual selection, false/nested-detection cleanup, precise crop adjustment, naming, and export.
Edge-connected background removal with configurable target color, tolerance, edge softness, zoom, reset, and full-resolution export.
Procedural sprite animation with presets, parameter controls, live preview, full-resolution generation, playback, PNG-frame export, sprite-sheet export, and animation metadata.
- Load PNG, JPG, JPEG, BMP, and WebP images
- Detect individual non-transparent sprite regions automatically
- Organize detected sprites into visual rows
- Generate automatic row/sprite filenames
- Display a live detected-sprite count
- Select sprites from the preview or sprite list
- Delete incorrect or nested detections
- Automatically recalculate sprite order and names after deletion
- Drag crop rectangles to reposition them
- Drag crop edges/corners to resize them
- Fine-tune Left, Right, Top, and Bottom crop edges by exactly 1 pixel
- Enter exact X, Y, Width, and Height values
- Optionally auto-apply exact geometry as values change
- Rename selected sprites
- Keep or remove dimension suffixes from filenames
- Add transparent export padding
- Zoom at fixed percentages
- Fit the preview to the viewport
- Use Ctrl + mouse wheel, precision touchpad input, and supported native pinch gestures for preview zoom
- Export detected sprites as lossless RGBA PNG files inside a ZIP archive
- Send a selected full-resolution crop directly to Sprite Animator
Detected sprites are named according to their visual row and position.
Example:
row1sprite1_152x140.png
row1sprite2_256x256.png
row2sprite1_180x180.png
row2sprite2_128x128.png
If a sprite is renamed to:
player_idle
with Keep dimensions enabled:
player_idle_152x140.png
With dimensions disabled:
player_idle.png
Crop dimensions are recalculated after manual geometry changes.
Automatic detection provides the starting crop regions.
You can then:
- Select a crop directly in the preview
- Drag the entire crop rectangle
- Drag an edge or corner
- Fine-tune one edge at a time by 1 pixel
- Enter exact crop geometry
- Delete false or nested detections
Each side has − and + controls.
| Edge | − |
+ |
|---|---|---|
| Left | Moves left edge outward 1 px | Moves left edge inward 1 px |
| Right | Moves right edge outward 1 px | Moves right edge inward 1 px |
| Top | Moves top edge outward 1 px | Moves top edge inward 1 px |
| Bottom | Moves bottom edge outward 1 px | Moves bottom edge inward 1 px |
The selected crop exposes:
X
Y
Width
Height
With Auto crop on value change enabled, edits apply immediately.
With it disabled, edit the values and press Apply Crop.
Important: Running Detect Sprites again performs a new automatic-detection pass and replaces current manual detection/crop adjustments.
The Sprite Splitter displays a live count such as:
Detected Sprites: 36
The value updates as detections are created, removed, or recalculated.
The Background Remover uses an edge-connected flood-fill workflow. It begins at the outer image border and removes matching background-like pixels connected to the exterior instead of globally deleting every similar-colored pixel.
Available target modes:
- Auto Corner Color
- White
- Black
- Custom
Auto Corner Color samples the four corners and estimates the exterior background color.
Custom opens the system color picker.
Controls how different a pixel may be from the target color while still being treated as background-like.
Lower values are more conservative.
Higher values allow a wider range of similar colors.
Controls the alpha transition near the removal threshold.
Lower values produce harder edges.
Higher values create softer transitions.
Restores:
Color tolerance: 30
Edge softness: 20
The original loaded image is kept separately from the editable working image.
Reset Background restores:
working_image = original_image
The preview supports:
- 25%
- 50%
- 100%
- 200%
- 400%
- Fit
- Ctrl + mouse wheel
- Precision touchpad zoom
- Native pinch gestures when exposed by Qt/OS
Zoom affects only the display proxy. The actual working image remains full-resolution.
The processed image can be exported directly.
Exports the current full-resolution working image as RGBA PNG and preserves transparency.
Supports:
- PNG
- WebP
- JPEG
- BMP
PNG and WebP can preserve transparency.
JPEG does not support transparency, so Sprite Studio warns before flattening transparent pixels onto white.
BMP is also flattened onto white for predictable compatibility.
The original source image is never overwritten automatically.
Sprite Animator creates procedural frame animation from either:
- the complete current Working Image, or
- the exact currently selected Sprite Splitter crop
The Animator owns a full-resolution source copy for production generation.
Reduced preview frames are kept separate from the production timeline.
Current presets:
- Idle Float
- Pulse
- Bounce
- Wobble
- Shake
- Spin
- Rock
- Pop In
- Pop Out
- Fade In
- Fade Out
- Squash & Stretch
- Damage Hit
- Spawn
- Despawn
- Selection
- Success
- Charge
- Jump
- Drop
- Jelly
Each preset exposes relevant controls such as travel distance, rotation, squash/stretch strength, scale, cycles, recoil, vibration, jump height, landing squash, and other motion parameters.
Sets the exact number of full-resolution production frames.
Current range:
2–120 frames
Sets total animation playback duration.
Calculated automatically:
FPS = Frames ÷ Duration
Examples:
| Frames | Duration | FPS |
|---|---|---|
| 12 | 0.5 sec | 24 FPS |
| 24 | 1.0 sec | 24 FPS |
| 60 | 1.0 sec | 60 FPS |
Available easing modes:
- Linear
- Ease In
- Ease Out
- Ease In Out
Controls whether Preview Generated loops after the final production frame.
Adds transparent canvas space around transformations to reduce clipping during motion such as spins, jumps, bounce, wobble, and jelly deformation.
With Live Regenerate Preview enabled, parameter changes can generate a lightweight preview automatically.
For responsiveness, live preview may:
- downscale a temporary source copy
- generate no more than 6 temporary preview frames
These temporary frames are not the production animation and are never exported.
Press Generate Animation to create the requested production sequence.
Production rendering:
- uses the Animator's full-resolution source image
- runs with Qt background workers
- reports frame-by-frame progress
- keeps expensive Pillow rendering off the Qt UI thread
- supports cooperative cancellation
- preserves the previous completed timeline when a later generation is cancelled
Generation progress is displayed as completed frames, total frames, percentage, and a progress bar.
Example:
Generating 8 / 12 frames (67%)
After production generation completes:
- Preview Generated plays the completed full-resolution sequence
- Stop Preview stops playback
- the current frame number is displayed
- Loop Playback controls whether playback repeats
Animation export always uses the completed full-resolution production frames.
Reduced Live Preview frames are never exported.
Exports every production frame as an individual lossless RGBA PNG.
Example:
robot_jump_001.png
robot_jump_002.png
robot_jump_003.png
Frame numbering automatically uses enough digits for the generated sequence.
Packs all production frames into one transparent PNG.
Available layouts:
- Horizontal
- Vertical
- Grid
All generated frames use a consistent frame canvas, making the resulting sheet suitable for standard sprite-sheet workflows.
When Export Animation Metadata (.json) is enabled, Sprite Studio writes a companion JSON file.
Metadata includes:
- source name
- preset key and name
- frame count
- duration
- calculated FPS
- loop setting
- frame width
- frame height
- easing
- preset parameters
Sprite-sheet metadata additionally includes:
- sheet layout
- columns
- rows
- sheet width
- sheet height
- Godot
hframes - Godot
vframes - animation FPS
UZKHJ Sprite Studio deliberately keeps two main Pillow images:
The untouched source loaded from disk.
The editable image shared by the Studio tools.
Load Image
↓
original_image
↓ copy
working_image
↓
Background Remover
↓
Sprite Splitter
↓
Sprite Animator
Background removal modifies only the working image.
Reset Background restores the working image from the original.
Sprite detection and crops operate on the working image.
The Animator can use the entire working image or one selected crop.
The following use full-resolution image data:
- background processing
- sprite detection
- crop coordinates
- Sprite Splitter exports
- selected-sprite Animator handoff
- full animation generation
- PNG-frame animation export
- sprite-sheet animation export
On-screen previews may use reduced display proxies for responsiveness.
Preview scaling does not reduce production export quality.
The loaded file path is displayed near the top of the application and is selectable in the interface.
UZKHJ Sprite Studio supports:
- Normal Appearance
- Dark Appearance
The selected appearance and application window size are persisted using
Qt QSettings.
The How To menu contains integrated Markdown-based documentation for:
- Studio Overview
- Sprite Splitter
- Background Remover
- Sprite Animator
- Naming & Export
- Keyboard Shortcuts
The guide viewer supports Normal and Dark appearance.
| Shortcut | Action |
|---|---|
Ctrl+O |
Load Image |
Ctrl+D |
Detect Sprites |
Delete |
Delete Selected Sprite Region |
Ctrl+Shift+A |
Animate Selected Sprite |
| Platform standard Quit shortcut | Exit UZKHJ Sprite Studio |
Load Image
↓
Background Remover (optional)
↓
Remove Background
↓
Sprite Splitter
↓
Detect Sprites
↓
Review / Delete False Detections
↓
Fine Tune / Exact Geometry
↓
Rename if desired
↓
Export ZIP
Load Image
↓
Background Remover (optional)
↓
Sprite Splitter (optional)
↓
Select Sprite
↓
Animate Selected
↓
Choose Preset
↓
Configure Frames / Duration / Parameters
↓
Generate Animation
↓
Preview Generated
↓
Export PNG Frames or Sprite Sheet
A standalone sprite can also be animated directly using Use Working Image without running Sprite Splitter first.
UZKHJ Sprite Studio is intended for:
- Windows
- macOS
- Linux
Prebuilt packages are distributed through the repository's Releases section.
Users of packaged versions do not need to install Python, PySide6, Pillow, Python-Markdown, PyInstaller, VS Code, or another development environment.
Download the Windows package from Releases, extract it, and launch:
UZKHJ Sprite Studio.exe
Windows may display a security warning for unsigned applications downloaded from the internet.
Download the macOS package from Releases, extract it, and open:
UZKHJ Sprite Studio.app
If the application is not code-signed/notarized, macOS may display a Gatekeeper warning.
Download the Linux package from Releases and extract it.
If required:
chmod +x "UZKHJ Sprite Studio"Then:
./"UZKHJ Sprite Studio"Linux behavior may vary by distribution and desktop environment.
UZKHJ Sprite Studio is distributed publicly as compiled application releases.
The application source code is maintained privately and is not distributed through the public repository.
The public repository is intended for:
- product documentation
LICENSE.md- screenshots and branding
- issue reporting and feedback
- official Windows, macOS, and Linux releases
Users of official packaged releases do not need Python or the development dependencies installed.
License notice: UZKHJ Sprite Studio is proprietary, closed-source software. Access to an official compiled release does not grant permission to modify, redistribute, repackage, resell, host, or create derivative versions of the Software. See
LICENSE.md.
Development source code, build configuration, and internal development files are maintained privately.
Official Windows, macOS, and Linux packages are built by UZKHJ and published through the public repository's Releases section.
The public repository does not contain the application's Python source code or private build configuration.
UZKHJ-Sprite-Studio/
│
├── README.md
├── LICENSE.md
│
├── logo/
│ └── UZKHJ_Sprite_Studio_Logo.png
│
└── Screenshots/
├── spritesplitter1.jpg
├── spritesplitter2.jpg
├── spritesplitter3.jpg
├── bgremover1.jpg
├── bgremover2.jpg
├── animator1.jpg
└── animator2.jpg
Compiled applications are distributed through GitHub Releases rather than committed to the public repository.
UZKHJ Sprite Studio is built using technologies including:
- Python
- PySide6 / Qt
- Pillow
- Python-Markdown
- PyInstaller
- GitHub Actions
The current image-processing and animation workflows operate locally and do not require an external processing server.
Animation frame count is a major generation-cost multiplier.
For typical sprites, a useful starting point is around 12--24 FPS.
If production generation is too expensive:
- Cancel generation.
- Reduce Frames.
- Keep Duration unchanged if you want the same animation length.
- Generate again.
Live Preview is intentionally lighter than full production generation.
Compiled releases are available from the project's GitHub Releases page.
Repository:
https://github.com/UZKHJ/UZKHJ-Sprite-Studio
Developer GitHub:
If you encounter a bug or unexpected behavior, open an issue in the GitHub repository.
Useful information to include can vary by tool.
- source image dimensions
- expected sprite count
- alpha/background characteristics
- detection settings
- crop behavior
- image dimensions
- background type/color
- tolerance
- edge softness
- selected target mode
- source dimensions
- preset
- frame count
- duration
- easing
- preset parameters
- whether Automatic Frame Canvas was enabled
- export layout if the issue is export-related
UZKHJ Sprite Studio uses a Custom Proprietary License.
The Software is proprietary, closed-source software. The public repository does not contain the application's private development source code.
Solo Developers and organizations with five (5) or fewer employees may commercially use eligible User Output subject to the complete license terms.
If User Output produced with UZKHJ Sprite Studio is used in an application, game, website, asset pack, media project, or any other published or distributed work, attribution to the official repository is required.
The credit must identify UZKHJ Sprite Studio and include the full repository URL:
Created/processed with UZKHJ Sprite Studio
https://github.com/UZKHJ/UZKHJ-Sprite-Studio
Equivalent wording is permitted as long as UZKHJ Sprite Studio is named and the full repository URL is included.
The credit may be placed in a reasonable location such as an About screen, Credits screen, README, documentation, store listing, acknowledgements section, asset-pack description, or another location reasonably accessible to users or recipients.
See LICENSE.md for the complete terms.
See LICENSE.md for the complete warranty disclaimer and limitation
of liability.
© 2026 UZKHJ
https://github.com/UZKHJ