Agent skill
app-store-image-enhancer
Enhances image resolution, sharpness, and clarity using Python/Pillow. Perfect for app store icons (1024x1024), screenshots, and social media images.
Install this agent skill to your Project
npx add-skill https://github.com/BillChirico/bills-claude-skills/tree/main/app-store-image-enhancer
SKILL.md
App Store Image Enhancer
Enhance images to be sharper, clearer, and more professional using Python's Pillow library.
When to Use This Skill
- Preparing app icons for App Store/Google Play (must be 1024x1024 PNG)
- Improving screenshot quality for documentation or marketing
- Enhancing images for social media posts
- Upscaling low-resolution images
- Sharpening blurry photos
- Cleaning up compression artifacts
Implementation
Required Setup
pip install Pillow --break-system-packages
Core Enhancement Script
from PIL import Image, ImageEnhance, ImageFilter
import os
def enhance_image(
input_path: str,
output_path: str = None,
target_size: tuple = None,
sharpen_factor: float = 1.5,
contrast_factor: float = 1.1,
mode: str = "general"
) -> str:
"""
Enhance an image with sharpening, contrast adjustment, and optional resizing.
Args:
input_path: Path to the source image
output_path: Path for enhanced image (default: adds '-enhanced' suffix)
target_size: Tuple of (width, height) for resizing, or None to preserve
sharpen_factor: Sharpness multiplier (1.0 = original, >1.0 = sharper)
contrast_factor: Contrast multiplier (1.0 = original, >1.0 = more contrast)
mode: "app-icon", "screenshot", or "general"
Returns:
Path to the enhanced image
"""
# Open and convert to RGBA for transparency support
img = Image.open(input_path)
original_mode = img.mode
if img.mode != 'RGBA':
img = img.convert('RGBA')
# Apply mode-specific settings
if mode == "app-icon":
target_size = (1024, 1024)
sharpen_factor = 1.8
contrast_factor = 1.15
elif mode == "screenshot":
sharpen_factor = 1.4
contrast_factor = 1.05
# Resize if target size specified (use LANCZOS for quality)
if target_size:
img = img.resize(target_size, Image.Resampling.LANCZOS)
# Apply unsharp mask for edge enhancement
img = img.filter(ImageFilter.UnsharpMask(radius=2, percent=150, threshold=3))
# Enhance sharpness
sharpener = ImageEnhance.Sharpness(img)
img = sharpener.enhance(sharpen_factor)
# Enhance contrast
contraster = ImageEnhance.Contrast(img)
img = contraster.enhance(contrast_factor)
# Generate output path if not provided
if not output_path:
base, ext = os.path.splitext(input_path)
output_path = f"{base}-enhanced.png"
# Save as PNG for quality (convert to RGB if no transparency needed)
if mode == "app-icon" or output_path.lower().endswith('.png'):
img.save(output_path, 'PNG', optimize=True)
else:
# For JPG output, convert to RGB
if img.mode == 'RGBA':
background = Image.new('RGB', img.size, (255, 255, 255))
background.paste(img, mask=img.split()[3])
img = background
img.save(output_path, quality=95, optimize=True)
return output_path
def analyze_image(input_path: str) -> dict:
"""
Analyze image quality metrics.
Args:
input_path: Path to the image
Returns:
Dictionary with image analysis results
"""
img = Image.open(input_path)
return {
"path": input_path,
"format": img.format,
"mode": img.mode,
"size": img.size,
"width": img.size[0],
"height": img.size[1],
"is_square": img.size[0] == img.size[1],
"has_transparency": img.mode in ('RGBA', 'LA', 'P'),
"file_size_kb": os.path.getsize(input_path) / 1024,
"meets_app_icon_spec": img.size[0] >= 1024 and img.size[1] >= 1024
}
def batch_enhance(
directory: str,
output_dir: str = None,
extensions: tuple = ('.png', '.jpg', '.jpeg', '.webp'),
**enhance_kwargs
) -> list:
"""
Enhance all images in a directory.
Args:
directory: Source directory path
output_dir: Output directory (default: same as source with '-enhanced' suffix)
extensions: Tuple of file extensions to process
**enhance_kwargs: Arguments passed to enhance_image()
Returns:
List of output file paths
"""
if not output_dir:
output_dir = f"{directory.rstrip('/')}-enhanced"
os.makedirs(output_dir, exist_ok=True)
results = []
for filename in os.listdir(directory):
if filename.lower().endswith(extensions):
input_path = os.path.join(directory, filename)
base, _ = os.path.splitext(filename)
output_path = os.path.join(output_dir, f"{base}-enhanced.png")
enhance_image(input_path, output_path, **enhance_kwargs)
results.append(output_path)
return results
Usage Examples
App Store Icon Enhancement
# Enhance for app store (auto-resizes to 1024x1024)
result = enhance_image("my-icon.png", mode="app-icon")
print(f"Enhanced icon saved to: {result}")
Screenshot Enhancement
# Enhance screenshot without resizing
result = enhance_image("screenshot.png", mode="screenshot")
Custom Enhancement
# Custom settings
result = enhance_image(
"photo.jpg",
target_size=(2048, 2048),
sharpen_factor=2.0,
contrast_factor=1.2
)
Batch Processing
# Enhance all images in a folder
enhanced_files = batch_enhance("./images", mode="screenshot")
print(f"Enhanced {len(enhanced_files)} images")
App Store Icon Requirements
| Platform | Size | Format | Notes |
|---|---|---|---|
| iOS App Store | 1024×1024 | PNG | No transparency, no rounded corners (iOS adds them) |
| Google Play | 512×512 | PNG | Can have transparency |
| macOS App Store | 1024×1024 | PNG | Can have transparency |
Important: iOS App Store icons should NOT have transparency—use a solid background. The system applies the rounded corners automatically.
Output Specifications
When mode="app-icon":
- Size: 1024×1024 pixels
- Format: PNG
- Sharpness: Enhanced (1.8x)
- Contrast: Slightly boosted (1.15x)
- Optimized file size
Tips
- Always preserve originals (the script creates new files by default)
- Use
mode="app-icon"for store submissions - Use
mode="screenshot"for documentation images - For social media, consider platform-specific sizes after enhancement
- JPG output is supported but PNG is preferred for icons
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
github-pr-resolver
Resolve GitHub PR review comments and fix failing CI checks. Creates a team with teammates to process threads in parallel, tracks ALL threads across ALL pages, processes each with individual commits, marks each resolved immediately, and verifies all resolved + CI passing before completion.
volvox-brand
Apply Volvox LLC's official brand identity, colors, typography, and voice to artifacts. Use when creating Volvox-branded content including websites, landing pages, presentations, social media posts, marketing materials, UI components, or any output requiring Volvox's visual identity and tone. Triggers on requests involving Volvox branding, Decision Jar, Sobers, or Volvox Community styling.
discord-markdown
Format text for Discord using markdown syntax. Use when composing Discord messages, bot responses, embed descriptions, forum posts, webhook payloads, or any content destined for Discord's chat interface. Triggers on requests mentioning Discord formatting, Discord messages, Discord bots, Discord embeds, or when the user needs text styled for Discord's rendering engine. Covers bold, italic, underline, strikethrough, spoilers, code blocks with syntax highlighting, headers, subtext, lists, block quotes, masked links, timestamps, and mentions. Always presents Discord-ready messages inside fenced code blocks so the user can copy-paste them directly into Discord with all markdown formatting preserved.
setup-pre-commit
Set up Husky pre-commit hooks with lint-staged (Prettier), type checking, and tests in the current repo. Use when user wants to add pre-commit hooks, set up Husky, configure lint-staged, or add commit-time formatting/typechecking/testing.
handoff
Compact the current conversation into a handoff document for another agent to pick up.
edit-article
Edit and improve articles by restructuring sections, improving clarity, and tightening prose. Use when user wants to edit, revise, or improve an article draft.
Didn't find tool you were looking for?