{"id":"5cf5039b-aa92-4e5e-9d21-185260e65551","entityType":"agent","slug":"clawhub-galbria-image-utils","name":"Image Utils by Bria.ai","canonicalUrl":"https://xpersona.co/agent/clawhub-galbria-image-utils","canonicalPath":"/agent/clawhub-galbria-image-utils","generatedAt":"2026-04-17T05:10:57.449Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization... Skill: Image Utils by Bria.ai Owner: galbria Summary: Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization... Tags: latest:1.2.1 Version history: v1.2.1 | 2026-02-23T12:48:52.425Z | user No code or functionality changes detected in this version. - Updated skill description to clarify use cases and integration with","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 681 downloads reported by the source. Last updated 4/15/2026.","installCommand":"clawhub skill install kn7artjmk0ncb5fmp9x21x4tss80jshr:image-utils","sourceUrl":"https://clawhub.ai/galbria/image-utils","homepage":"https://clawhub.ai/galbria/image-utils","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/galbria/image-utils","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":57,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"stars":null,"forks":null,"downloads":681,"packageName":null,"latestVersion":"1.2.1","tractionLabel":"681 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-03-01T03:14:00.935Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-03-01T03:14:00.935Z","lastIndexedAt":null,"nextCrawlAt":"2026-03-02T03:14:00.935Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.1","createdAt":"2026-02-23T12:48:52.425Z","changelog":"No code or functionality changes detected in this version. - Updated skill description to clarify use cases and integration with Bria AI. - Added license, author, and version metadata to SKILL.md. - No modifications to source code or implementation.","fileCount":3,"zipByteSize":10083},{"version":"0.0.1","createdAt":"2026-02-08T08:59:34.067Z","changelog":"Initial release of image-utils: classic image processing utilities. - Provides Pillow-based functions for deterministic pixel-level image operations. - Supports resizing, cropping, compositing, format conversion, watermarks, borders, and image adjustments. - Works as a standalone module or for post-processing AI-generated images. - Simple API for loading, saving, and batch-processing images from various sources (file, URL, bytes, base64). - Includes optimizations for web and social media, with quick reference and usage examples.","fileCount":3,"zipByteSize":9948}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install kn7artjmk0ncb5fmp9x21x4tss80jshr:image-utils","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/snapshot","contractUrl":"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/contract","trustUrl":"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/trust"},"curlExamples":["curl -s \"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/snapshot\"","curl -s \"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/contract\"","curl -s \"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-04-17T05:10:57.449Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/dossier","snapshotUrl":"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/snapshot","contractUrl":"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/contract","trustUrl":"https://xpersona.co/api/v1/agents/clawhub-galbria-image-utils/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"Skill: Image Utils by Bria.ai\n\nOwner: galbria\n\nSummary: Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization...\n\nTags: latest:1.2.1\n\nVersion history:\n\nv1.2.1 | 2026-02-23T12:48:52.425Z | user\n\nNo code or functionality changes detected in this version.\n\n- Updated skill description to clarify use cases and integration with Bria AI.\n- Added license, author, and version metadata to SKILL.md.\n- No modifications to source code or implementation.\n\nv0.0.1 | 2026-02-08T08:59:34.067Z | auto\n\nInitial release of image-utils: classic image processing utilities.\n\n- Provides Pillow-based functions for deterministic pixel-level image operations.\n- Supports resizing, cropping, compositing, format conversion, watermarks, borders, and image adjustments.\n- Works as a standalone module or for post-processing AI-generated images.\n- Simple API for loading, saving, and batch-processing images from various sources (file, URL, bytes, base64).\n- Includes optimizations for web and social media, with quick reference and usage examples.\n\nArchive index:\n\nArchive v1.2.1: 3 files, 10083 bytes\n\nFiles: references/code-examples/image_utils.py (27552b), SKILL.md (9609b), _meta.json (130b)\n\nFile v1.2.1:SKILL.md\n\n---\nname: image-utils\ndescription: Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization. Use this skill when post-processing AI-generated images, preparing images for web delivery, batch processing image directories, creating responsive image variants, or performing any deterministic pixel-level image operation. Works standalone or alongside bria-ai for post-processing generated images.\nlicense: MIT\nmetadata:\n  author: Bria AI\n  version: \"1.2.1\"\n---\n\n# Image Utilities\n\nPillow-based utilities for deterministic pixel-level image operations. Use for resize, crop, composite, format conversion, watermarks, and other standard image processing tasks.\n\n## When to Use This Skill\n\n- **Post-processing AI-generated images**: Resize, crop, optimize for web after generation\n- **Format conversion**: PNG ↔ JPEG ↔ WEBP with quality control\n- **Compositing**: Overlay images, paste subjects onto backgrounds\n- **Batch processing**: Resize to multiple sizes, add watermarks\n- **Web optimization**: Compress and resize for fast delivery\n- **Social media preparation**: Crop to platform-specific aspect ratios\n\n## Quick Reference\n\n| Operation | Method | Description |\n|-----------|--------|-------------|\n| **Loading** | `load(source)` | Load from URL, path, bytes, or base64 |\n| | `load_from_url(url)` | Download image from URL |\n| **Saving** | `save(image, path)` | Save with format auto-detection |\n| | `to_bytes(image, format)` | Convert to bytes |\n| | `to_base64(image, format)` | Convert to base64 string |\n| **Resizing** | `resize(image, width, height)` | Resize to exact dimensions |\n| | `scale(image, factor)` | Scale by factor (0.5 = half) |\n| | `thumbnail(image, size)` | Fit within size, maintain aspect |\n| **Cropping** | `crop(image, left, top, right, bottom)` | Crop to region |\n| | `crop_center(image, width, height)` | Crop from center |\n| | `crop_to_aspect(image, ratio)` | Crop to aspect ratio |\n| **Compositing** | `paste(bg, fg, position)` | Overlay at coordinates |\n| | `composite(bg, fg, mask)` | Alpha composite |\n| | `fit_to_canvas(image, w, h)` | Fit onto canvas size |\n| **Borders** | `add_border(image, width, color)` | Add solid border |\n| | `add_padding(image, padding)` | Add whitespace padding |\n| **Transforms** | `rotate(image, angle)` | Rotate by degrees |\n| | `flip_horizontal(image)` | Mirror horizontally |\n| | `flip_vertical(image)` | Flip vertically |\n| **Watermarks** | `add_text_watermark(image, text)` | Add text overlay |\n| | `add_image_watermark(image, logo)` | Add logo watermark |\n| **Adjustments** | `adjust_brightness(image, factor)` | Lighten/darken |\n| | `adjust_contrast(image, factor)` | Adjust contrast |\n| | `adjust_saturation(image, factor)` | Adjust color saturation |\n| | `blur(image, radius)` | Apply Gaussian blur |\n| **Web** | `optimize_for_web(image, max_size)` | Optimize for delivery |\n| **Info** | `get_info(image)` | Get dimensions, format, mode |\n\n## Requirements\n\n```bash\npip install Pillow requests\n```\n\n## Basic Usage\n\n```python\nfrom image_utils import ImageUtils\n\n# Load from URL\nimage = ImageUtils.load_from_url(\"https://example.com/image.jpg\")\n\n# Or load from various sources\nimage = ImageUtils.load(\"/path/to/image.png\")         # File path\nimage = ImageUtils.load(image_bytes)                  # Bytes\nimage = ImageUtils.load(\"data:image/png;base64,...\")  # Base64\n\n# Resize and save\nresized = ImageUtils.resize(image, width=800, height=600)\nImageUtils.save(resized, \"output.webp\", quality=90)\n\n# Get image info\ninfo = ImageUtils.get_info(image)\nprint(f\"{info['width']}x{info['height']} {info['mode']}\")\n```\n\n## Resizing & Scaling\n\n```python\n# Resize to exact dimensions\nresized = ImageUtils.resize(image, width=800, height=600)\n\n# Resize maintaining aspect ratio (fit within bounds)\nfitted = ImageUtils.resize(image, width=800, height=600, maintain_aspect=True)\n\n# Resize by width only (height auto-calculated)\nresized = ImageUtils.resize(image, width=800)\n\n# Scale by factor\nhalf = ImageUtils.scale(image, 0.5)    # 50% size\ndouble = ImageUtils.scale(image, 2.0)  # 200% size\n\n# Create thumbnail\nthumb = ImageUtils.thumbnail(image, (150, 150))\n```\n\n## Cropping\n\n```python\n# Crop to specific region\ncropped = ImageUtils.crop(image, left=100, top=50, right=500, bottom=350)\n\n# Crop from center\ncenter = ImageUtils.crop_center(image, width=400, height=400)\n\n# Crop to aspect ratio (for social media)\nsquare = ImageUtils.crop_to_aspect(image, \"1:1\")      # Instagram\nwide = ImageUtils.crop_to_aspect(image, \"16:9\")       # YouTube thumbnail\nstory = ImageUtils.crop_to_aspect(image, \"9:16\")      # Stories/Reels\n\n# Control crop anchor\ntop_crop = ImageUtils.crop_to_aspect(image, \"16:9\", anchor=\"top\")\nbottom_crop = ImageUtils.crop_to_aspect(image, \"16:9\", anchor=\"bottom\")\n```\n\n## Compositing\n\n```python\n# Paste foreground onto background\nresult = ImageUtils.paste(background, foreground, position=(100, 50))\n\n# Alpha composite (foreground must have transparency)\nresult = ImageUtils.composite(background, foreground)\n\n# Fit image onto canvas with letterboxing\ncanvas = ImageUtils.fit_to_canvas(\n    image,\n    width=1200,\n    height=800,\n    background_color=(255, 255, 255, 255),  # White\n    position=\"center\"  # or \"top\", \"bottom\"\n)\n```\n\n## Format Conversion\n\n```python\n# Convert to different formats\npng_bytes = ImageUtils.to_bytes(image, \"PNG\")\njpeg_bytes = ImageUtils.to_bytes(image, \"JPEG\", quality=85)\nwebp_bytes = ImageUtils.to_bytes(image, \"WEBP\", quality=90)\n\n# Get base64 for data URLs\nbase64_str = ImageUtils.to_base64(image, \"PNG\")\ndata_url = ImageUtils.to_base64(image, \"PNG\", include_data_url=True)\n# Returns: \"data:image/png;base64,...\"\n\n# Save with format auto-detected from extension\nImageUtils.save(image, \"output.png\")\nImageUtils.save(image, \"output.jpg\", quality=85)\nImageUtils.save(image, \"output.webp\", quality=90)\n```\n\n## Watermarks\n\n```python\n# Text watermark\nwatermarked = ImageUtils.add_text_watermark(\n    image,\n    text=\"© 2024 My Company\",\n    position=\"bottom-right\",  # bottom-left, top-right, top-left, center\n    font_size=24,\n    color=(255, 255, 255, 128),  # Semi-transparent white\n    margin=20\n)\n\n# Logo/image watermark\nlogo = ImageUtils.load(\"logo.png\")\nwatermarked = ImageUtils.add_image_watermark(\n    image,\n    watermark=logo,\n    position=\"bottom-right\",\n    opacity=0.5,\n    scale=0.15,  # 15% of image width\n    margin=20\n)\n```\n\n## Adjustments\n\n```python\n# Brightness (1.0 = original, <1 darker, >1 lighter)\nbright = ImageUtils.adjust_brightness(image, 1.3)\ndark = ImageUtils.adjust_brightness(image, 0.7)\n\n# Contrast (1.0 = original)\nhigh_contrast = ImageUtils.adjust_contrast(image, 1.5)\n\n# Saturation (0 = grayscale, 1.0 = original, >1 more vivid)\nvivid = ImageUtils.adjust_saturation(image, 1.3)\ngrayscale = ImageUtils.adjust_saturation(image, 0)\n\n# Sharpness\nsharp = ImageUtils.adjust_sharpness(image, 2.0)\n\n# Blur\nblurred = ImageUtils.blur(image, radius=5)\n```\n\n## Transforms\n\n```python\n# Rotate (counter-clockwise, degrees)\nrotated = ImageUtils.rotate(image, 45)\nrotated = ImageUtils.rotate(image, 90, expand=False)  # Don't expand canvas\n\n# Flip\nmirrored = ImageUtils.flip_horizontal(image)\nflipped = ImageUtils.flip_vertical(image)\n```\n\n## Borders & Padding\n\n```python\n# Add solid border\nbordered = ImageUtils.add_border(image, width=5, color=(0, 0, 0))\n\n# Add padding (whitespace)\npadded = ImageUtils.add_padding(image, padding=20)  # Uniform\npadded = ImageUtils.add_padding(image, padding=(10, 20, 10, 20))  # left, top, right, bottom\n```\n\n## Web Optimization\n\n```python\n# Optimize for web delivery\noptimized_bytes = ImageUtils.optimize_for_web(\n    image,\n    max_dimension=1920,  # Resize if larger\n    format=\"WEBP\",       # Best compression\n    quality=85\n)\n\n# Save optimized\nwith open(\"optimized.webp\", \"wb\") as f:\n    f.write(optimized_bytes)\n```\n\n## Integration with AI Image Generation\n\nUse with Bria AI or other image generation APIs:\n\n```python\nfrom bria_client import BriaClient\nfrom image_utils import ImageUtils\n\nclient = BriaClient()\n\n# Generate with AI\nresult = client.generate(\"product photo of headphones\", aspect_ratio=\"1:1\")\nimage_url = result['result']['image_url']\n\n# Download and post-process\nimage = ImageUtils.load_from_url(image_url)\n\n# Create multiple sizes for responsive images\nsizes = {\n    \"large\": ImageUtils.resize(image, width=1200),\n    \"medium\": ImageUtils.resize(image, width=600),\n    \"thumb\": ImageUtils.thumbnail(image, (150, 150))\n}\n\n# Save all as optimized WebP\nfor name, img in sizes.items():\n    ImageUtils.save(img, f\"product_{name}.webp\", quality=85)\n```\n\n## Batch Processing Example\n\n```python\nfrom pathlib import Path\nfrom image_utils import ImageUtils\n\ndef process_catalog(input_dir, output_dir):\n    \"\"\"Process all images in a directory.\"\"\"\n    output_path = Path(output_dir)\n    output_path.mkdir(exist_ok=True)\n\n    for image_file in Path(input_dir).glob(\"*.{jpg,png,webp}\"):\n        image = ImageUtils.load(image_file)\n\n        # Crop to square\n        square = ImageUtils.crop_to_aspect(image, \"1:1\")\n\n        # Resize to standard size\n        resized = ImageUtils.resize(square, width=800, height=800)\n\n        # Add watermark\n        final = ImageUtils.add_text_watermark(resized, \"© My Brand\")\n\n        # Save optimized\n        output_file = output_path / f\"{image_file.stem}.webp\"\n        ImageUtils.save(final, output_file, quality=85)\n\nprocess_catalog(\"./raw_images\", \"./processed\")\n```\n\n## API Reference\n\nSee [image_utils.py](./references/code-examples/image_utils.py) for complete implementation with docstrings.\n\nFile v1.2.1:_meta.json\n\n{\n  \"ownerId\": \"kn7artjmk0ncb5fmp9x21x4tss80jshr\",\n  \"slug\": \"image-utils\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1771850932425\n}\n\nArchive v0.0.1: 3 files, 9948 bytes\n\nFiles: references/code-examples/image_utils.py (27508b), SKILL.md (9384b), _meta.json (130b)\n\nFile v0.0.1:SKILL.md\n\n---\nname: image-utils\ndescription: Use when performing classic image manipulation - resize, crop, composite, format conversion, watermarks, adjustments. Pillow-based utilities for deterministic pixel-level operations. Use alongside AI image generation (like Bria) for post-processing, or standalone for any image processing task.\n---\n\n# Image Utilities\n\nPillow-based utilities for deterministic pixel-level image operations. Use for resize, crop, composite, format conversion, watermarks, and other standard image processing tasks.\n\n## When to Use This Skill\n\n- **Post-processing AI-generated images**: Resize, crop, optimize for web after generation\n- **Format conversion**: PNG ↔ JPEG ↔ WEBP with quality control\n- **Compositing**: Overlay images, paste subjects onto backgrounds\n- **Batch processing**: Resize to multiple sizes, add watermarks\n- **Web optimization**: Compress and resize for fast delivery\n- **Social media preparation**: Crop to platform-specific aspect ratios\n\n## Quick Reference\n\n| Operation | Method | Description |\n|-----------|--------|-------------|\n| **Loading** | `load(source)` | Load from URL, path, bytes, or base64 |\n| | `load_from_url(url)` | Download image from URL |\n| **Saving** | `save(image, path)` | Save with format auto-detection |\n| | `to_bytes(image, format)` | Convert to bytes |\n| | `to_base64(image, format)` | Convert to base64 string |\n| **Resizing** | `resize(image, width, height)` | Resize to exact dimensions |\n| | `scale(image, factor)` | Scale by factor (0.5 = half) |\n| | `thumbnail(image, size)` | Fit within size, maintain aspect |\n| **Cropping** | `crop(image, left, top, right, bottom)` | Crop to region |\n| | `crop_center(image, width, height)` | Crop from center |\n| | `crop_to_aspect(image, ratio)` | Crop to aspect ratio |\n| **Compositing** | `paste(bg, fg, position)` | Overlay at coordinates |\n| | `composite(bg, fg, mask)` | Alpha composite |\n| | `fit_to_canvas(image, w, h)` | Fit onto canvas size |\n| **Borders** | `add_border(image, width, color)` | Add solid border |\n| | `add_padding(image, padding)` | Add whitespace padding |\n| **Transforms** | `rotate(image, angle)` | Rotate by degrees |\n| | `flip_horizontal(image)` | Mirror horizontally |\n| | `flip_vertical(image)` | Flip vertically |\n| **Watermarks** | `add_text_watermark(image, text)` | Add text overlay |\n| | `add_image_watermark(image, logo)` | Add logo watermark |\n| **Adjustments** | `adjust_brightness(image, factor)` | Lighten/darken |\n| | `adjust_contrast(image, factor)` | Adjust contrast |\n| | `adjust_saturation(image, factor)` | Adjust color saturation |\n| | `blur(image, radius)` | Apply Gaussian blur |\n| **Web** | `optimize_for_web(image, max_size)` | Optimize for delivery |\n| **Info** | `get_info(image)` | Get dimensions, format, mode |\n\n## Requirements\n\n```bash\npip install Pillow requests\n```\n\n## Basic Usage\n\n```python\nfrom image_utils import ImageUtils\n\n# Load from URL\nimage = ImageUtils.load_from_url(\"https://example.com/image.jpg\")\n\n# Or load from various sources\nimage = ImageUtils.load(\"/path/to/image.png\")         # File path\nimage = ImageUtils.load(image_bytes)                  # Bytes\nimage = ImageUtils.load(\"data:image/png;base64,...\")  # Base64\n\n# Resize and save\nresized = ImageUtils.resize(image, width=800, height=600)\nImageUtils.save(resized, \"output.webp\", quality=90)\n\n# Get image info\ninfo = ImageUtils.get_info(image)\nprint(f\"{info['width']}x{info['height']} {info['mode']}\")\n```\n\n## Resizing & Scaling\n\n```python\n# Resize to exact dimensions\nresized = ImageUtils.resize(image, width=800, height=600)\n\n# Resize maintaining aspect ratio (fit within bounds)\nfitted = ImageUtils.resize(image, width=800, height=600, maintain_aspect=True)\n\n# Resize by width only (height auto-calculated)\nresized = ImageUtils.resize(image, width=800)\n\n# Scale by factor\nhalf = ImageUtils.scale(image, 0.5)    # 50% size\ndouble = ImageUtils.scale(image, 2.0)  # 200% size\n\n# Create thumbnail\nthumb = ImageUtils.thumbnail(image, (150, 150))\n```\n\n## Cropping\n\n```python\n# Crop to specific region\ncropped = ImageUtils.crop(image, left=100, top=50, right=500, bottom=350)\n\n# Crop from center\ncenter = ImageUtils.crop_center(image, width=400, height=400)\n\n# Crop to aspect ratio (for social media)\nsquare = ImageUtils.crop_to_aspect(image, \"1:1\")      # Instagram\nwide = ImageUtils.crop_to_aspect(image, \"16:9\")       # YouTube thumbnail\nstory = ImageUtils.crop_to_aspect(image, \"9:16\")      # Stories/Reels\n\n# Control crop anchor\ntop_crop = ImageUtils.crop_to_aspect(image, \"16:9\", anchor=\"top\")\nbottom_crop = ImageUtils.crop_to_aspect(image, \"16:9\", anchor=\"bottom\")\n```\n\n## Compositing\n\n```python\n# Paste foreground onto background\nresult = ImageUtils.paste(background, foreground, position=(100, 50))\n\n# Alpha composite (foreground must have transparency)\nresult = ImageUtils.composite(background, foreground)\n\n# Fit image onto canvas with letterboxing\ncanvas = ImageUtils.fit_to_canvas(\n    image,\n    width=1200,\n    height=800,\n    background_color=(255, 255, 255, 255),  # White\n    position=\"center\"  # or \"top\", \"bottom\"\n)\n```\n\n## Format Conversion\n\n```python\n# Convert to different formats\npng_bytes = ImageUtils.to_bytes(image, \"PNG\")\njpeg_bytes = ImageUtils.to_bytes(image, \"JPEG\", quality=85)\nwebp_bytes = ImageUtils.to_bytes(image, \"WEBP\", quality=90)\n\n# Get base64 for data URLs\nbase64_str = ImageUtils.to_base64(image, \"PNG\")\ndata_url = ImageUtils.to_base64(image, \"PNG\", include_data_url=True)\n# Returns: \"data:image/png;base64,...\"\n\n# Save with format auto-detected from extension\nImageUtils.save(image, \"output.png\")\nImageUtils.save(image, \"output.jpg\", quality=85)\nImageUtils.save(image, \"output.webp\", quality=90)\n```\n\n## Watermarks\n\n```python\n# Text watermark\nwatermarked = ImageUtils.add_text_watermark(\n    image,\n    text=\"© 2024 My Company\",\n    position=\"bottom-right\",  # bottom-left, top-right, top-left, center\n    font_size=24,\n    color=(255, 255, 255, 128),  # Semi-transparent white\n    margin=20\n)\n\n# Logo/image watermark\nlogo = ImageUtils.load(\"logo.png\")\nwatermarked = ImageUtils.add_image_watermark(\n    image,\n    watermark=logo,\n    position=\"bottom-right\",\n    opacity=0.5,\n    scale=0.15,  # 15% of image width\n    margin=20\n)\n```\n\n## Adjustments\n\n```python\n# Brightness (1.0 = original, <1 darker, >1 lighter)\nbright = ImageUtils.adjust_brightness(image, 1.3)\ndark = ImageUtils.adjust_brightness(image, 0.7)\n\n# Contrast (1.0 = original)\nhigh_contrast = ImageUtils.adjust_contrast(image, 1.5)\n\n# Saturation (0 = grayscale, 1.0 = original, >1 more vivid)\nvivid = ImageUtils.adjust_saturation(image, 1.3)\ngrayscale = ImageUtils.adjust_saturation(image, 0)\n\n# Sharpness\nsharp = ImageUtils.adjust_sharpness(image, 2.0)\n\n# Blur\nblurred = ImageUtils.blur(image, radius=5)\n```\n\n## Transforms\n\n```python\n# Rotate (counter-clockwise, degrees)\nrotated = ImageUtils.rotate(image, 45)\nrotated = ImageUtils.rotate(image, 90, expand=False)  # Don't expand canvas\n\n# Flip\nmirrored = ImageUtils.flip_horizontal(image)\nflipped = ImageUtils.flip_vertical(image)\n```\n\n## Borders & Padding\n\n```python\n# Add solid border\nbordered = ImageUtils.add_border(image, width=5, color=(0, 0, 0))\n\n# Add padding (whitespace)\npadded = ImageUtils.add_padding(image, padding=20)  # Uniform\npadded = ImageUtils.add_padding(image, padding=(10, 20, 10, 20))  # left, top, right, bottom\n```\n\n## Web Optimization\n\n```python\n# Optimize for web delivery\noptimized_bytes = ImageUtils.optimize_for_web(\n    image,\n    max_dimension=1920,  # Resize if larger\n    format=\"WEBP\",       # Best compression\n    quality=85\n)\n\n# Save optimized\nwith open(\"optimized.webp\", \"wb\") as f:\n    f.write(optimized_bytes)\n```\n\n## Integration with AI Image Generation\n\nUse with Bria AI or other image generation APIs:\n\n```python\nfrom bria_client import BriaClient\nfrom image_utils import ImageUtils\n\nclient = BriaClient()\n\n# Generate with AI\nresult = client.generate(\"product photo of headphones\", aspect_ratio=\"1:1\")\nimage_url = result['result']['image_url']\n\n# Download and post-process\nimage = ImageUtils.load_from_url(image_url)\n\n# Create multiple sizes for responsive images\nsizes = {\n    \"large\": ImageUtils.resize(image, width=1200),\n    \"medium\": ImageUtils.resize(image, width=600),\n    \"thumb\": ImageUtils.thumbnail(image, (150, 150))\n}\n\n# Save all as optimized WebP\nfor name, img in sizes.items():\n    ImageUtils.save(img, f\"product_{name}.webp\", quality=85)\n```\n\n## Batch Processing Example\n\n```python\nfrom pathlib import Path\nfrom image_utils import ImageUtils\n\ndef process_catalog(input_dir, output_dir):\n    \"\"\"Process all images in a directory.\"\"\"\n    output_path = Path(output_dir)\n    output_path.mkdir(exist_ok=True)\n\n    for image_file in Path(input_dir).glob(\"*.{jpg,png,webp}\"):\n        image = ImageUtils.load(image_file)\n\n        # Crop to square\n        square = ImageUtils.crop_to_aspect(image, \"1:1\")\n\n        # Resize to standard size\n        resized = ImageUtils.resize(square, width=800, height=800)\n\n        # Add watermark\n        final = ImageUtils.add_text_watermark(resized, \"© My Brand\")\n\n        # Save optimized\n        output_file = output_path / f\"{image_file.stem}.webp\"\n        ImageUtils.save(final, output_file, quality=85)\n\nprocess_catalog(\"./raw_images\", \"./processed\")\n```\n\n## API Reference\n\nSee [image_utils.py](./references/code-examples/image_utils.py) for complete implementation with docstrings.\n\nFile v0.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7artjmk0ncb5fmp9x21x4tss80jshr\",\n  \"slug\": \"image-utils\",\n  \"version\": \"0.0.1\",\n  \"publishedAt\": 1770541174067\n}","readmeExcerpt":"Skill: Image Utils by Bria.ai Owner: galbria Summary: Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization... Tags: latest:1.2.1 Version history: v1.2.1 | 2026-02-23T12:48:52.425Z | user No code or functionality changes detected in this version. - Updated skill description to clarify use cases and integration with","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"pip install Pillow requests"},{"language":"python","snippet":"from image_utils import ImageUtils\n\n# Load from URL\nimage = ImageUtils.load_from_url(\"https://example.com/image.jpg\")\n\n# Or load from various sources\nimage = ImageUtils.load(\"/path/to/image.png\")         # File path\nimage = ImageUtils.load(image_bytes)                  # Bytes\nimage = ImageUtils.load(\"data:image/png;base64,...\")  # Base64\n\n# Resize and save\nresized = ImageUtils.resize(image, width=800, height=600)\nImageUtils.save(resized, \"output.webp\", quality=90)\n\n# Get image info\ninfo = ImageUtils.get_info(image)\nprint(f\"{info['width']}x{info['height']} {info['mode']}\")"},{"language":"python","snippet":"# Resize to exact dimensions\nresized = ImageUtils.resize(image, width=800, height=600)\n\n# Resize maintaining aspect ratio (fit within bounds)\nfitted = ImageUtils.resize(image, width=800, height=600, maintain_aspect=True)\n\n# Resize by width only (height auto-calculated)\nresized = ImageUtils.resize(image, width=800)\n\n# Scale by factor\nhalf = ImageUtils.scale(image, 0.5)    # 50% size\ndouble = ImageUtils.scale(image, 2.0)  # 200% size\n\n# Create thumbnail\nthumb = ImageUtils.thumbnail(image, (150, 150))"},{"language":"python","snippet":"# Crop to specific region\ncropped = ImageUtils.crop(image, left=100, top=50, right=500, bottom=350)\n\n# Crop from center\ncenter = ImageUtils.crop_center(image, width=400, height=400)\n\n# Crop to aspect ratio (for social media)\nsquare = ImageUtils.crop_to_aspect(image, \"1:1\")      # Instagram\nwide = ImageUtils.crop_to_aspect(image, \"16:9\")       # YouTube thumbnail\nstory = ImageUtils.crop_to_aspect(image, \"9:16\")      # Stories/Reels\n\n# Control crop anchor\ntop_crop = ImageUtils.crop_to_aspect(image, \"16:9\", anchor=\"top\")\nbottom_crop = ImageUtils.crop_to_aspect(image, \"16:9\", anchor=\"bottom\")"},{"language":"python","snippet":"# Paste foreground onto background\nresult = ImageUtils.paste(background, foreground, position=(100, 50))\n\n# Alpha composite (foreground must have transparency)\nresult = ImageUtils.composite(background, foreground)\n\n# Fit image onto canvas with letterboxing\ncanvas = ImageUtils.fit_to_canvas(\n    image,\n    width=1200,\n    height=800,\n    background_color=(255, 255, 255, 255),  # White\n    position=\"center\"  # or \"top\", \"bottom\"\n)"},{"language":"python","snippet":"# Convert to different formats\npng_bytes = ImageUtils.to_bytes(image, \"PNG\")\njpeg_bytes = ImageUtils.to_bytes(image, \"JPEG\", quality=85)\nwebp_bytes = ImageUtils.to_bytes(image, \"WEBP\", quality=90)\n\n# Get base64 for data URLs\nbase64_str = ImageUtils.to_base64(image, \"PNG\")\ndata_url = ImageUtils.to_base64(image, \"PNG\", include_data_url=True)\n# Returns: \"data:image/png;base64,...\"\n\n# Save with format auto-detected from extension\nImageUtils.save(image, \"output.png\")\nImageUtils.save(image, \"output.jpg\", quality=85)\nImageUtils.save(image, \"output.webp\", quality=90)"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: image-utils\ndescription: Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization. Use this skill when post-processing AI-generated images, preparing images for web delivery, batch processing image directories, creating responsive image variants, or performing any deterministic pixel-level image operation. Works standalone or alongside bria-ai for post-processing generated images.\nlicense: MIT\nmetadata:\n  author: Bria AI\n  version: \"1.2.1\"\n---\n\n# Image Utilities\n\nPillow-based utilities for deterministic pixel-level image operations. Use for resize, crop, composite, format conversion, watermarks, and other standard image processing tasks.\n\n## When to Use This Skill\n\n- **Post-processing AI-generated images**: Resize, crop, optimize for web after generation\n- **Format conversion**: PNG ↔ JPEG ↔ WEBP with quality control\n- **Compositing**: Overlay images, paste subjects onto backgrounds\n- **Batch processing**: Resize to multiple sizes, add watermarks\n- **Web optimization**: Compress and resize for fast delivery\n- **Social media preparation**: Crop to platform-specific aspect ratios\n\n## Quick Reference\n\n| Operation | Method | Description |\n|-----------|--------|-------------|\n| **Loading** | `load(source)` | Load from URL, path, bytes, or base64 |\n| | `load_from_url(url)` | Download image from URL |\n| **Saving** | `save(image, path)` | Save with format auto-detection |\n| | `to_bytes(image, format)` | Convert to bytes |\n| | `to_base64(image, format)` | Convert to base64 string |\n| **Resizing** | `resize(image, width, height)` | Resize to exact dimensions |\n| | `scale(image, factor)` | Scale by factor (0.5 = half) |\n| | `thumbnail(image, size)` | Fit within size, maintain aspect |\n| **Cropping** | `crop(image, left, top, right, bottom)` | Crop to region |\n| | `crop_center(image, width, height)` | Crop from center |\n| | `crop_to_aspect(image, ratio)` | Crop to aspect ratio |\n| **Compositing** | `paste(bg, fg, position)` | Overlay at coordinates |\n| | `composite(bg, fg, mask)` | Alpha composite |\n| | `fit_to_canvas(image, w, h)` | Fit onto canvas size |\n| **Borders** | `add_border(image, width, color)` | Add solid border |\n| | `add_padding(image, padding)` | Add whitespace padding |\n| **Transforms** | `rotate(image, angle)` | Rotate by degrees |\n| | `flip_horizontal(image)` | Mirror horizontally |\n| | `flip_vertical(image)` | Flip vertically |\n| **Watermarks** | `add_text_watermark(image, text)` | Add text overlay |\n| | `add_image_watermark(image, logo)` | Add logo watermark |\n| **Adjustments** | `adjust_brightness(image, factor)` | Lighten/darken |\n| | `adjust_contrast(image, factor)` | Adjust contrast |\n| | `adjust_saturation(image, factor)` | Adjust color saturation |\n| | `blur(image, radius)` | Apply Gaussian blur |\n| **Web** | `optimize_for_web(image, max_size)` | Optimize for delivery |\n| **Info** | `get_info(image)` | Get dimensions, forma"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7artjmk0ncb5fmp9x21x4tss80jshr\",\n  \"slug\": \"image-utils\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1771850932425\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization... Skill: Image Utils by Bria.ai Owner: galbria Summary: Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization... Tags: latest:1.2.1 Version history: v1.2.1 | 2026-02-23T12:48:52.425Z | user No code or functionality changes detected in this version. - Updated skill description to clarify use cases and integration with","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":893,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-04-17T05:10:57.449Z","emptyReason":null},"items":[{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}