
Security News
Deno 2.6 + Socket: Supply Chain Defense In Your CLI
Deno 2.6 introduces deno audit with a new --socket flag that plugs directly into Socket to bring supply chain security checks into the Deno CLI.
imgrs
Advanced tools
Version 0.3.1 - Advanced text rendering has been re-added through the new TextMixin system, providing comprehensive text operations without external dependencies.
Imgrs is a blazingly fast, modern image processing library for Python, powered by Rust. Imgrs provides a Pillow-compatible API while delivering significantly better performance for common image operations.
pip install imgrs
import imgrs
# Open an image
img = imgrs.open("photo.jpg")
# Resize image
resized = img.resize((800, 600))
# Crop image
cropped = img.crop((100, 100, 500, 400))
# Rotate image
rotated = img.rotate(90)
# Save image
img.save("output.png")
# to preview
img.show()
# Create new image
new_img = imgrs.new("RGB", (800, 600), "red")
# Convert image modes
gray_img = img.convert("L") # RGB to grayscale
rgba_img = img.convert("RGBA") # Add alpha channel
# Split image into channels
r, g, b = img.split() # RGB image -> 3 grayscale images
# Paste one image onto another
base = imgrs.new("RGB", (200, 200), "white")
overlay = imgrs.new("RGB", (100, 100), "red")
result = base.paste(overlay, (50, 50)) # Paste at position (50, 50)
# Create image from NumPy array (requires numpy)
import numpy as np
array = np.random.randint(0, 256, (100, 100, 3), dtype=np.uint8)
img_from_array = imgrs.fromarray(array)
# Apply filters for image enhancement
blurred = img.blur(2.0)
sharpened = img.sharpen(1.5)
sepia_tone = img.sepia()
# Pixel manipulation
pixel_color = img.getpixel((50, 50))
img.putpixel((50, 50), (255, 0, 0, 255))
# Color analysis
histogram = img.histogram()
dominant = img.dominant_color()
average = img.average_color()
# Drawing operations
img.draw_rectangle(10, 10, 100, 100, (255, 0, 0, 128))
img.draw_circle(150, 150, 50, (0, 255, 0, 128))
img.draw_line(0, 0, 200, 200, (0, 0, 255, 255))
# Text rendering
img.add_text("Hello World!", (20, 20), size=32, color=(0, 0, 0, 255))
img.add_text_styled("Styled Text", (20, 60), size=24, color=(255, 255, 255, 255),
outline=(0, 0, 0, 255, 1.0), background=(100, 149, 237, 255))
img.add_text_multiline("Multi-line\ntext example", (20, 100), size=18, color=(0, 100, 0, 255))
# Replace this:
# from PIL import Image
# With this:
from imgrs import Image
# Your existing Pillow code works unchanged!
img = Image.open("photo.jpg")
img = img.resize((400, 300))
img.save("resized.jpg")
open(), new(), save()resize(), crop(), rotate(), transpose()copy(), thumbnail()convert(), paste(), split() - NEW!fromarray() - NEW! NumPy Integrationsize, width, height, mode, formatBasic Filters:
blur() - Gaussian blur with adjustable radiussharpen() - Sharpening filter with adjustable strengthedge_detect() - Edge detection using Sobel operatoremboss() - Emboss effectbrightness() - Brightness adjustmentcontrast() - Contrast adjustmentCSS-like Filters:
sepia() - Sepia tone effectgrayscale_filter() - Grayscale conversion with amount controlinvert() - Color inversion effecthue_rotate() - Hue rotation in degreessaturate() - Saturation adjustmentFilter chaining - Combine multiple filters for complex effects
getpixel(), putpixel() - Direct pixel access and modificationhistogram() - Color histogram analysisdominant_color(), average_color() - Color analysisreplace_color() - Color replacement with tolerancethreshold() - Binary thresholdingposterize() - Color quantizationdraw_rectangle() - Filled rectangles with alpha blendingdraw_circle() - Filled circles with alpha blendingdraw_line() - Lines using Bresenham's algorithmcircle(), rectangle(), triangle(), ellipse(), star(), etc.add_text() - Basic text rendering with flexible positioningadd_text_styled() - Styled text with outlines, shadows, backgrounds, and opacityadd_text_multiline() - Multi-line text with alignment and custom line spacingadd_text_centered() - Horizontally centered text renderingget_text_dimensions() - Text size and metrics calculationget_multiline_text_dimensions() - Multi-line text dimensions with line countget_text_bounding_box() - Complete text bounding box with ascent/descent/baselineadd_text_with_shadow(), add_text_with_outline(), add_text_with_background()ImageFont.load() - Load TTF, OTF, WOFF, WOFF2 font filesImageFont.truetype() - Load TrueType fonts (Pillow-compatible)ImageFont.load_default() - Get default fallback fontImageFont.get_font() - Get font with automatic fallbacktext() - Pillow-compatible text drawing methoddrop_shadow() - Drop shadow with blur and offsetinner_shadow() - Inner shadow effectsglow() - Glow effects with customizable intensityfrombytes(), tobytes() - Enhanced I/O# Open image from file or bytes
img = imgrs.open("path/to/image.jpg")
img = imgrs.open(image_bytes)
# Create new image
img = imgrs.new(mode, size, color=None)
# Examples:
img = imgrs.new("RGB", (800, 600)) # Black image
img = imgrs.new("RGB", (800, 600), "red") # Red image
img = imgrs.new("RGB", (800, 600), (255, 0, 0)) # Red image with RGB tuple
# Resize image
resized = img.resize((width, height), resample=imgrs.Resampling.BILINEAR)
# Crop image (left, top, right, bottom)
cropped = img.crop((x1, y1, x2, y2))
# Rotate image (90Β°, 180Β°, 270Β° supported)
rotated = img.rotate(90)
# Transpose/flip image
flipped = img.transpose(imgrs.Transpose.FLIP_LEFT_RIGHT)
flipped = img.transpose(imgrs.Transpose.FLIP_TOP_BOTTOM)
# Copy image
copy = img.copy()
# Create thumbnail (modifies image in-place)
img.thumbnail((200, 200))
# Save image
img.save("output.jpg", format="JPEG")
img.save("output.png") # Format auto-detected from extension
img.show() # to preview
# Image dimensions
width = img.width
height = img.height
size = img.size # (width, height) tuple
# Image mode and format
mode = img.mode # "RGB", "RGBA", "L", etc.
format = img.format # "JPEG", "PNG", etc.
# Raw pixel data
bytes_data = img.to_bytes()
# Basic text rendering
img.add_text("Hello World!", (x, y), size=32, color=(0, 0, 0, 255))
img.add_text("Text", x, y, size=24, color=(255, 0, 0, 255)) # Separate x,y
# Styled text with effects
img.add_text_styled(
"Styled Text",
(x, y),
size=28,
color=(255, 255, 255, 255),
outline=(0, 0, 0, 255, 2.0), # Black outline, 2px width
shadow=(3, 3, 128, 128, 128, 200), # Gray shadow, offset by 3px
background=(100, 149, 237, 255), # Blue background
opacity=0.9
)
# Multi-line text
img.add_text_multiline(
"Line 1\nLine 2\nLine 3",
(x, y),
size=20,
color=(0, 0, 0, 255),
align="center", # "left", "center", or "right"
line_spacing=1.5 # Line spacing multiplier
)
# Centered text
img.add_text_centered("Centered Text", y, size=32, color=(0, 0, 0, 255))
# Text measurement
width, height, ascent, descent = img.get_text_dimensions("Text", 24)
bbox = img.get_text_bounding_box("Text", x, y, 24) # Returns dict with box info
# Convenience methods
img.add_text_with_shadow("Shadow Text", (x, y), size=24, color=(255, 0, 0, 255),
shadow_color=(0, 0, 0, 180), shadow_offset=(2, 2))
img.add_text_with_outline("Outlined", (x, y), size=20, color=(255, 255, 0, 255),
outline_color=(0, 0, 0, 255), outline_width=1.5)
# Clone repository
git clone https://github.com/grandpaej/imgrs.git
cd imgrs
# Install dependencies
pip install -r requirements.txt
# Build Rust extension
maturin develop --release
# Run tests
pytest python/imgrs/tests/
Contributions are welcome! Areas where help is needed:
frombytes(), tobytes(), arbitrary angle rotationApache Software License - see LICENSE file for details.
FAQs
A modern, high-performance image processing library for Python, powered by Rust.
We found that imgrs demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Β It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Deno 2.6 introduces deno audit with a new --socket flag that plugs directly into Socket to bring supply chain security checks into the Deno CLI.

Security News
New DoS and source code exposure bugs in React Server Components and Next.js: whatβs affected and how to update safely.

Security News
Socket CEO Feross Aboukhadijeh joins Software Engineering Daily to discuss modern software supply chain attacks and rising AI-driven security risks.