Introduction: The Challenge of Creating Engaging Quiz Visuals
As an e-learning developer and instructional designer, I constantly face the challenge of creating engaging, interactive content that keeps learners motivated. One particular pain point I encountered was generating hundreds of quiz choice images for a gamified learning platform I was developing.

The scenario was this: I had a bug-themed educational game where learners needed to select answers by clicking on different cartoon bugs. Each question had multiple choice options (A, B, C), and I needed to create unique images combining:
- Placeholder images (cute bug characters)
- Text option images (the actual answer choices)
- Consistent formatting across all questions
- Randomized bug assignments to keep things interesting
Doing this manually would have taken weeks. So, I created a Python script that automated the entire process. Today, I’m sharing both the original simple script and an enhanced version that other e-learning professionals can adapt for their own projects.
The Problem: Manual Image Creation is Time-Consuming

What I Started With:
- 20 questions with 3-4 options each (60+ individual images needed)
- 3 different bug character images (
bug 1.png
,bug 2.png
,bug 3.png
) - Text option images for each choice (
Q01-O1@3x.png
,Q01-O2@3x.png
, etc.) - A need for consistent positioning and formatting
What I Needed:
- Automated combination of bug images with text options
- Organized output with clear filenames
- Randomized bug assignments for variety
- Scalable solution for future quiz expansions
The Solution: Python Automation with PIL
How It Works:
- File Organization: Scans the
Options
directory for question files following the patternQ##-O#@3x.png
- Grouping: Groups options by question number (Q01, Q02, etc.)
- Random Assignment: Randomly assigns bug images to each option
- Image Composition: Overlays text options onto bug images
- Output Organization: Saves results in organized folders with clear naming
Key Improvements:
- Configuration Management: JSON-based configuration for easy customization
- Error Handling: Robust error handling with meaningful messages
- Flexible Positioning: Multiple text positioning options
- Better File Management: Improved organization and validation
- Statistics Reporting: Detailed generation statistics
- Type Hints: Professional code documentation
How to Use This Script for Your Projects

Step 1: Prepare Your Assets
File Structure:
YourProject/
├── Options/
│ ├── bug1.png # Your placeholder images
│ ├── bug2.png
│ ├── bug3.png
│ ├── Q01-O1@3x.png # Question 1, Option A
│ ├── Q01-O2@3x.png # Question 1, Option B
│ ├── Q01-O3@3x.png # Question 1, Option C
│ ├── Q02-O1@3x.png # Question 2, Option A
│ └── ...
├── script.py # Your Python script
└── GeneratedChoices/ # Output folder (auto-created)
Step 2: Install Dependencies
pip install Pillow
Step 3: Customize for Your Needs
For Different Themes: Replace the bug images with your theme:
- Characters (robots, animals, people)
- Objects (books, tools, vehicles)
- Abstract shapes (geometric forms, icons)
For Different File Naming: Modify the grouping logic to match your naming convention:
# For files like "Chapter1_OptionA.png"
q_num = f.split('_')[0]
# For files like "lesson-01-choice-a.png"
parts = f.split('-')
q_num = f"{parts[0]}-{parts[1]}"
Step 4: Run the Script
Simple Usage:
# Just run with default settings
python script.py
Advanced Usage:
from enhanced_quiz_generator import QuizImageGenerator
# Create with custom configuration
generator = QuizImageGenerator("my_config.json")
stats = generator.generate_all_images()
print(f"Generated {stats['total_images']} images!")
Real-World Applications Beyond Quizzes
This script isn’t limited to quiz creation. Here are other e-learning applications:
1. Interactive Scenarios
- Character + dialogue combinations
- Branching story visuals
- Role-play scenario images
2. Vocabulary Learning
- Word + visual associations
- Language learning flashcards
- Cultural context imagery
3. Product Training
- Product images + feature callouts
- Process steps + visual guides
- Safety procedures + warning overlays
4. Assessment Varieties
- True/False with visual cues
- Matching exercises
- Sequence ordering activities
Configuration Options Explained
The enhanced script offers extensive customization through JSON configuration:
{
"options_dir": "./Assets",
"output_dir": "./FinalImages",
"placeholder_images": ["character1.png", "character2.png"],
"text_position": "bottom_center",
"text_width_ratio": 0.9,
"text_height_ratio": 0.3,
"padding": 15
}
Configuration Parameters:
options_dir
: Where your source images are storedoutput_dir
: Where generated images will be savedplaceholder_images
: List of your character/background imagestext_position
: Where text appears (top_center
,bottom_center
,center
)text_width_ratio
: Text width as percentage of placeholder widthtext_height_ratio
: Text height as percentage of placeholder heightpadding
: Space between text and image edges
Performance and Scalability

Performance Metrics from My Project:
- 20 questions × 3 options = 60 images
- Generation time: ~5 seconds
- File size: Consistent 150-300KB per image
- Memory usage: Minimal (processes one image at a time)
Scalability Considerations:
- 100+ questions: No performance issues
- Large image files: Consider resizing source images first
- Multiple themes: Use separate configuration files
- Batch processing: The script handles unlimited questions automatically
Troubleshooting Common Issues
Issue 1: “IndexError: list index out of range”
Cause: Questions with different numbers of options Solution: The enhanced script automatically handles this with idx % len(bug_images)
Issue 2: “FileNotFoundError”
Cause: Missing placeholder or option images Solution: The enhanced script provides detailed warnings about missing files
Issue 3: Poor Image Quality
Cause: Incorrect resize ratios Solution: Adjust text_width_ratio
and text_height_ratio
in configuration
Issue 4: Text Positioning Problems
Cause: Different placeholder image sizes Solution: Use the text_position
and padding
settings to fine-tune placement
Advanced Customizations
Adding Background Effects
def add_background_effect(self, text_img: Image.Image) -> Image.Image:
"""Add semi-transparent background for better text readability."""
background = Image.new('RGBA', text_img.size, (255, 255, 255, 128))
return Image.alpha_composite(background, text_img)
Custom Text Positioning
def custom_position(self, placeholder_size, text_size, option_index):
"""Position text based on option index."""
positions = ["top_left", "top_right", "bottom_center"]
return self.calculate_position(positions[option_index % 3])
Batch Processing Multiple Projects
def process_multiple_projects(project_configs):
"""Process multiple e-learning projects in sequence."""
for config in project_configs:
generator = QuizImageGenerator(config)
generator.generate_all_images()
Cost Savings and Time Benefits
Manual vs. Automated Comparison:
Manual Creation (Photoshop/Canva):
- Time per image: 5-10 minutes
- 60 images = 5-10 hours of work
- Cost: $500-1000 (designer time)
- Consistency: Variable
- Updates: Time-consuming
Automated with Python:
- Setup time: 30 minutes
- Generation time: 5 seconds total
- Cost: Free (after initial script development)
- Consistency: Perfect
- Updates: Instant regeneration
ROI: The script pays for itself after the first project!
Future Enhancements and Ideas
Planned Improvements:
- Web Interface: Browser-based configuration and generation
- Batch Templates: Pre-built configurations for common use cases
- Animation Support: Generate animated GIFs for interactive elements
- AI Integration: Automatic image optimization and positioning
- Learning Analytics: Integration with LMS platforms
Community Contributions:
I’m open to collaborating with other e-learning professionals to expand this tool. Potential areas for community development:
- Templates Library: Share configurations for different educational themes
- Integration Plugins: Connect with popular authoring tools
- Quality Metrics: Automated assessment of generated image quality
- Accessibility Features: Alt-text generation and colorblind-friendly options
Conclusion: Automation Enables Creativity
This Python script transformed my quiz creation workflow from a tedious manual process into an automated, scalable solution. More importantly, it freed up time to focus on what really matters: creating engaging learning experiences and meaningful educational content.
The key takeaways for fellow e-learning professionals:
- Identify Repetitive Tasks: Look for patterns in your content creation workflow
- Start Simple: Begin with basic automation, then enhance based on real needs
- Document Everything: Good documentation makes scripts reusable across projects
- Share and Collaborate: The e-learning community benefits when we share our tools
- Focus on Learning: Automation should enhance, not replace, instructional design creativity