A modern, extensible image editor built with Python and CustomTkinter, featuring a modular architecture for easy customization and plugin development.
- Modern Dark UI: Built with CustomTkinter for a sleek, modern interface
- Modular Architecture: Extensible plugin system for custom image processing modules
- Interactive Image Viewer:
- Zoom in/out with mouse wheel
- Pan images by dragging
- Fit to window or view at actual size
- Non-destructive Editing: Undo/redo functionality preserves edit history
- Module Organization: Hierarchical module organization with search functionality
- Multiple Format Support: JPEG, PNG, BMP, GIF, TIFF, and more
- Batch Processing Ready: Modular design allows for easy batch processing implementation
- Python 3.7 or higher
- pip package manager
pip install customtkinter pillowgit clone https://github.com/nguyenhhoa03/Openpix.git
cd OpenpixEnsure your project has the following structure:
Openpix/
├── app.py # Main application file
├── setting.py # Settings configuration (optional)
├── modules/ # Image processing modules
│ ├── filters/ # Filter modules
│ ├── effects/ # Effect modules
│ └── tools/ # Tool modules
├── icons/ # Module icons (PNG format)
├── temp/ # Temporary files (auto-created)
└── README.md
python app.pyOr with an image file:
python app.py path/to/image.jpg- Open Image: Click "Open" or run with image path as argument
- Navigate: Use zoom controls or mouse wheel to navigate
- Apply Modules: Click module buttons in the right panel
- Undo/Redo: Use the undo/redo buttons to navigate edit history
- Save: Save changes to original file or save as new file
- Mouse Wheel: Zoom in/out
- Left Click + Drag: Pan image
- Search Bar: Filter modules by name
Modules are Python scripts that process images. They should follow this structure:
#!/usr/bin/env python3
import argparse
from PIL import Image
def process_image(input_path, output_path):
"""
Process the image from input_path and save to output_path
"""
try:
# Open input image
image = Image.open(input_path)
# Your processing logic here
# Example: Convert to grayscale
processed_image = image.convert('L')
# Save processed image
processed_image.save(output_path)
return True
except Exception as e:
print(f"Error processing image: {e}")
return False
def main():
parser = argparse.ArgumentParser(description='Image processing module')
parser.add_argument('-i', '--input', required=True, help='Input image path')
parser.add_argument('-o', '--output', required=True, help='Output image path')
args = parser.parse_args()
success = process_image(args.input, args.output)
if not success:
exit(1)
if __name__ == "__main__":
main()- Input/Output: Use
-ifor input and-ofor output arguments - Error Handling: Handle errors gracefully and return appropriate exit codes
- File Formats: Preserve original format when possible
- Documentation: Include docstrings and comments
- Icons: Add corresponding PNG icons in the
icons/directory
Organize modules in subdirectories within the modules/ folder:
modules/
├── filters/
│ ├── blur.py
│ ├── sharpen.py
│ └── vintage.py
├── effects/
│ ├── sepia.py
│ ├── vignette.py
│ └── glow.py
└── tools/
├── crop.py
├── resize.py
└── rotate.py
Place PNG icons in the icons/ directory with the same name as your module:
icons/
├── blur.py.png
├── sharpen.py.png
├── sepia.py.png
└── crop.py.png
The application can be configured through setting.py (if present). Access settings through the Settings button in the toolbar.
The application uses CustomTkinter's dark theme by default. This can be modified in the main() function:
ctk.set_appearance_mode("dark") # "light", "dark", "system"
ctk.set_default_color_theme("blue") # "blue", "green", "dark-blue"We welcome contributions! Please follow these guidelines:
- Fork the Repository: Create your own fork of the project
- Create Feature Branch:
git checkout -b feature/new-feature - Follow Code Style: Maintain consistent code formatting
- Test Your Changes: Ensure all functionality works correctly
- Submit Pull Request: Provide clear description of changes
# Clone your fork
git clone https://github.com/yourusername/Openpix.git
cd Openpix
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install customtkinter pillow
# Run in development mode
python app.py- Missing Directories Error: Ensure
modules/,icons/, andtemp/directories exist - Module Not Working: Check module follows the required argument structure (
-i,-o) - Icon Not Loading: Verify PNG icon exists in
icons/directory with correct name - Permission Errors: Ensure write permissions for temp directory
Run with Python's debug flag for detailed error information:
python -u app.pyThis project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
- Built with CustomTkinter for modern UI
- Image processing powered by Pillow
- Inspired by modern image editing workflows
- GitHub Issues: Report bugs and request features
- Discussions: Share ideas and get help from the community
- Wiki: Additional documentation and tutorials
Made with ❤️, Free and open source forever