{"id":"12ec5f37-332a-44db-826d-2ee67ce5116f","shortId":"mRGxwh","kind":"skill","title":"image-utils","tagline":"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 direct","description":"# 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## When NOT to Use This Skill — Use `bria-ai` Instead\n\nThis skill handles **deterministic pixel-level operations** only. For any **generative or AI-powered** image work, use the `bria-ai` skill instead:\n\n- **Generating images from text prompts** → use `bria-ai`\n- **AI background removal or replacement** → use `bria-ai`\n- **AI image editing (inpainting, object removal/addition)** → use `bria-ai`\n- **Style transfer or AI-driven visual effects** → use `bria-ai`\n- **Creating product lifestyle shots with AI** → use `bria-ai`\n- **Image upscaling with AI super-resolution** → use `bria-ai`\n\n**Rule of thumb**: If the task requires *creating new visual content* or *understanding image semantics*, use `bria-ai`. If the task requires *transforming existing pixels* (resize, crop, format convert, watermark), use this skill.\n\nIf `bria-ai` is not available, install it with:\n```bash\nnpx skills add bria-ai/bria-skill\n```\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 Bria AI\n\nUse alongside the **[bria-ai skill](https://clawhub.ai/galbria/bria-ai)** to post-process AI-generated images. Generate or edit images with Bria's API, then use image-utils for resizing, cropping, watermarking, and web optimization.\n\n```python\nimport requests\nfrom image_utils import ImageUtils\n\n# Generate with Bria AI (see bria-ai skill for full API reference)\nresponse = requests.post(\n    \"https://engine.prod.bria-api.com/v2/image/generate\",\n    headers={\"api_token\": BRIA_API_KEY, \"Content-Type\": \"application/json\"},\n    json={\"prompt\": \"product photo of headphones\", \"aspect_ratio\": \"1:1\", \"sync\": True}\n)\nimage_url = response.json()[\"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.","tags":["image","utils","bria","skill","bria-ai","agen","agent-skill","agent-skills","ai-agents","claude-code-skill","claude-skills","image-generation"],"capabilities":["skill","source-bria-ai","skill-image-utils","topic-agen","topic-agent-skill","topic-agent-skills","topic-ai-agents","topic-claude-code-skill","topic-claude-skills","topic-image-generation"],"categories":["bria-skill"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Bria-AI/bria-skill/image-utils","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Bria-AI/bria-skill","source_repo":"https://github.com/Bria-AI/bria-skill","install_from":"skills.sh"}},"qualityScore":"0.477","qualityRationale":"deterministic score 0.48 from registry signals: · indexed on github topic:agent-skills · 54 github stars · SKILL.md body (10,322 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T06:56:04.280Z","embedding":null,"createdAt":"2026-04-18T22:16:00.139Z","updatedAt":"2026-05-02T06:56:04.280Z","lastSeenAt":"2026-05-02T06:56:04.280Z","tsv":"'/bria-skill':276 '/galbria/bria-ai)**':1087 '/image.jpg':517 '/path/to/image.png':525 '/processed':1319 '/raw_images':1318 '/references/code-examples/image_utils.py':1324 '/v2/image/generate':1141 '0':940,956,1012,1013,1014 '0.15':904 '0.5':340,620,902 '0.7':929 '1':676,677,916,918,944,1160,1161,1279,1280 '1.0':914,931,942 '1.3':924,951 '1.5':938 '10':1030,1032 '100':646,730 '1200':754,1192 '128':878 '15':905 '150':634,635,1201,1202 '16':684,694,705,715 '1920':1053 '2.0':626,962 '20':884,910,1023,1031,1033 '200':627 '2024':854 '24':873 '255':759,760,761,762,875,876,877 '350':652 '400':661,663 '45':979 '5':968,1010 '50':621,648,731 '500':650 '600':548,583,597,1197 '800':546,581,595,613,756,1289,1291 '85':789,838,1062,1220,1315 '9':685,693,706,716 '90':553,797,843,983 'add':108,272,402,407,410,414,435,440,443,448,1002,1015,1292 'adjust':17,451,452,457,461,463,467,911 'ai':29,77,137,153,161,172,173,181,182,191,196,203,209,213,217,224,243,262,275,1077,1083,1093,1127,1131 'ai-driven':195 'ai-gener':28,76,1092 'ai-pow':152 'alongsid':1079 'alpha':389,732 'anchor':698,707,717 'angl':420 'api':1103,1135,1143,1146,1320 'appli':473 'application/json':1151 'aspect':126,349,370,375,586,599,666,674,682,691,703,713,1158,1277 'auto':308,607,827 'auto-calcul':606 'auto-detect':307,826 'avail':265 'background':101,174,724,727,740,757 'base':45 'base64':291,318,323,537,538,799,803,806,812,822 'bash':269,495 'basic':500 'batch':37,102,1221 'best':1059 'bg':379,386 'blur':470,475,963,964 'border':401,403,409,999,1004,1005,1007 'bottom':356,651,709,718,768,859,862,899,1037 'bottom-left':861 'bottom-right':858,898 'bound':590 'brand':1300 'bria':136,160,171,180,190,202,212,223,242,261,274,1076,1082,1101,1126,1130,1145 'bria-ai':135,159,170,179,189,201,211,222,241,260,273,1081,1129 'bright':453,913,920,922,927 'brightness/contrast':16 'byte':289,311,316,531,532,777,779,783,785,791,793,1046,1073 'calcul':608 'canva':393,399,745,748,751,989 'catalog':1236,1317 'center':361,367,655,656,658,765,870 'classic':4 'clawhub.ai':1086 'clawhub.ai/galbria/bria-ai)**':1085 'clockwis':974 'color':406,468,758,874,1011 'compani':856 'complet':1326 'composit':12,58,95,377,385,390,719,733 'compress':112,1060 'content':235,1149 'content-typ':1148 'contrast':458,462,930,934,936 'control':94,696 'convers':14,60,88,770 'convert':254,314,321,772 'coordin':384 'counter':973 'counter-clockwis':972 'creat':204,232,629,1181 'crop':11,57,81,121,252,350,351,357,360,365,368,373,636,638,642,653,664,697,700,710,1111,1271 'dark':925 'darker':917 'data':535,801,809,816,820 'def':1234 'degre':423,975 'deliveri':36,117,485,1044 'descript':281 'detect':309,828 'determinist':48,142 'differ':774 'dimens':333,491,576,1052 'dir':1238,1240,1251,1262 'direct':40 'directori':1246 'docstr':1329 'doubl':623 'download':296,1170 'driven':197 'edit':184,1098 'effect':199 'engine.prod.bria-api.com':1140 'engine.prod.bria-api.com/v2/image/generate':1139 'exact':332,575 'exampl':1223 'example.com':516 'example.com/image.jpg':515 'exist':249,1253 'expand':984,988 'extens':830 'f':562,1070,1215,1307 'f.write':1071 'factor':336,339,455,460,466,616 'fals':985 'fast':116 'fg':380,387 'file':526,1258,1270,1304,1313 'final':1294,1311 'fit':345,391,397,588,591,742 'flip':424,429,432,990,995 'font':871 'foreground':722,728,734,741 'format':13,59,87,253,306,313,320,492,769,775,825,1057 'full':1134 'gaussian':474 'generat':30,78,86,150,164,1094,1096,1124 'get':487,490,554,798 'glob':1263 'grayscal':941,952 'h':396 'half':341,617 'handl':141 'header':1142 'headphon':1157 'height':329,364,547,567,582,596,605,662,755,1290 'high':933 'horizont':425,428,993 'imag':2,5,31,33,39,41,52,65,79,97,155,165,183,214,238,297,302,312,319,327,335,343,352,362,371,394,404,412,419,426,431,438,444,446,454,459,465,471,480,489,504,511,523,528,530,533,544,555,560,579,593,611,619,625,633,644,659,675,683,692,704,714,743,752,780,786,794,807,813,832,835,840,852,892,894,907,923,928,937,950,955,961,966,978,982,994,998,1008,1021,1028,1050,1095,1099,1107,1120,1164,1168,1175,1179,1186,1190,1195,1200,1230,1243,1257,1267,1269,1278 'image-util':1,1106 'image/png':536,821 'image_file.stem':1308 'image_utils.py':1323 'imageutil':507,1123,1233 'imageutils.add':849,891,1006,1019,1026,1295 'imageutils.adjust':921,926,935,948,953,959 'imageutils.blur':965 'imageutils.composite':739 'imageutils.crop':643,657,672,680,689,701,711,1275 'imageutils.fit':749 'imageutils.flip':992,996 'imageutils.get':558 'imageutils.load':512,524,529,534,888,1176,1268 'imageutils.optimize':1047 'imageutils.paste':726 'imageutils.resize':543,578,592,610,1189,1194,1286 'imageutils.rotate':977,981 'imageutils.save':549,831,834,839,1213,1310 'imageutils.scale':618,624 'imageutils.thumbnail':632,1199 'imageutils.to':778,784,792,805,811 'img':1210,1214 'implement':1327 'import':506,1117,1122,1227,1232 'includ':815 'info':486,488,556,557,559,563,566,568 'inpaint':185 'input':1237,1261 'instagram':678 'instal':266,497 'instead':138,163 'integr':1074 'jpeg':90,782,787 'jpg':1264 'json':1152 'key':1147 'larg':1188 'larger':1056 'left':353,645,863,869,1034 'letterbox':747 'level':51,145 'lifestyl':206 'lighten/darken':456 'lighter':919 'load':282,283,285,292,508,519 'logo':447,449,887,896 'logo.png':889 'logo/image':885 'maintain':348,585,598 'manipul':6 'margin':883,909 'mask':388 'max':481,1051 'media':119,670 'medium':1193 'method':280 'mirror':427,991 'mode':493,569 'multipl':106,1182 'must':735 'name':1209,1217 'new':233 'npx':270 'object':186 'ok':1254 'onto':100,398,723,744 'opac':901 'open':1066 'oper':53,146,279 'optim':20,82,111,477,483,1039,1041,1045,1064,1072,1115,1206,1302 'optimized.webp':1067 'origin':915,932,943 'output':1239,1247,1250,1303,1305,1312 'output.jpg':836 'output.png':833 'output.webp':551,841 'output_path.mkdir':1252 'overlay':96,382,442 'pad':411,413,416,1000,1016,1018,1020,1022,1025,1027,1029 'past':98,378,721 'path':288,303,527,1228,1248,1249,1260,1306 'pathlib':1226 'photo':1155 'pillow':9,44,498 'pillow-bas':43 'pip':496 'pixel':50,144,250 'pixel-level':49,143 'platform':124 'platform-specif':123 'png':89,776,781,808,814,1265 'posit':381,729,764,857,897 'post':26,74,1090,1173 'post-process':25,73,1089,1172 'power':154 'prepar':32,120 'print':561 'process':27,38,66,75,103,1091,1174,1222,1235,1241,1316 'product':205,1154,1216 'prompt':168,1153 'python':8,502,572,637,720,771,845,912,970,1001,1040,1116,1224 'qualiti':93,552,788,796,837,842,1061,1219,1314 'quick':277 'radius':472,967 'ratio':127,372,376,587,667,1159 'refer':278,1136,1321 'region':359,641 'remov':175 'removal/addition':187 'replac':177 'request':499,1118 'requests.post':1138 'requir':231,247,494 'resiz':10,56,80,104,114,251,325,326,330,539,542,550,570,573,577,584,601,609,1054,1110,1281,1285,1298 'resolut':220 'respons':1137,1185 'response.json':1166 'result':725,738,1167 'return':819 'right':355,649,860,866,900,1036 'rotat':418,421,971,976,980 'rule':225 'satur':464,469,939,949,954 'save':300,301,304,541,823,1063,1203,1301 'scale':334,337,571,614,903 'see':1128,1322 'semant':239 'semi':880 'semi-transpar':879 'sharp':957,958,960 'shot':207 'size':107,344,347,400,482,622,628,872,1183,1187,1284 'sizes.items':1212 'skill':23,72,133,140,162,258,271,1084,1132 'skill-image-utils' 'social':118,669 'solid':408,1003 'sourc':284,522 'source-bria-ai' 'specif':125,640 'squar':671,1273,1274,1287 'standard':64,1283 'stori':688 'stories/reels':695 'str':804 'string':324 'style':192 'subject':99 'super':219 'super-resolut':218 'sync':1162 'task':67,230,246 'text':167,436,439,441,846,850,853,1296 'thumb':227,631,1198 'thumbnail':342,630,687 'token':1144 'top':354,647,699,708,767,865,868,1035 'top-left':867 'top-right':864 'topic-agen' 'topic-agent-skill' 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code-skill' 'topic-claude-skills' 'topic-image-generation' 'transfer':193 'transform':248,417,969 'transpar':737,881 'true':600,818,1163,1255 'type':1150 'understand':237 'uniform':1024 'upscal':215 'url':287,294,295,299,510,514,802,810,817,1165,1169,1178,1180 'usag':501 'use':21,54,70,131,134,157,169,178,188,200,210,221,240,256,1078,1105 'util':3,42,46,505,1108,1121,1231 'various':521 'vertic':430,433,997 'visual':198,234 'vivid':946,947 'w':395 'watermark':15,61,109,255,434,437,445,450,844,847,848,851,886,890,893,895,1112,1293,1297 'wb':1068 'web':19,35,84,110,476,479,1038,1043,1049,1114 'webp':91,790,795,1058,1207,1218,1266,1309 'white':763,882 'whitespac':415,1017 'wide':679 'width':328,363,405,545,564,580,594,603,612,660,753,908,1009,1191,1196,1288 'within':346,589 'work':156 'x':565 'youtub':686","prices":[{"id":"36400993-adc7-41e8-952b-4c4cb45f1efa","listingId":"12ec5f37-332a-44db-826d-2ee67ce5116f","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Bria-AI","category":"bria-skill","install_from":"skills.sh"},"createdAt":"2026-04-18T22:16:00.139Z"}],"sources":[{"listingId":"12ec5f37-332a-44db-826d-2ee67ce5116f","source":"github","sourceId":"Bria-AI/bria-skill/image-utils","sourceUrl":"https://github.com/Bria-AI/bria-skill/tree/main/skills/image-utils","isPrimary":false,"firstSeenAt":"2026-04-18T22:16:00.139Z","lastSeenAt":"2026-05-02T06:56:04.280Z"}],"details":{"listingId":"12ec5f37-332a-44db-826d-2ee67ce5116f","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Bria-AI","slug":"image-utils","github":{"repo":"Bria-AI/bria-skill","stars":54,"topics":["agen","agent-skill","agent-skills","ai","ai-agents","claude-code-skill","claude-skills","image-generation"],"license":null,"html_url":"https://github.com/Bria-AI/bria-skill","pushed_at":"2026-04-26T12:15:03Z","description":"Claude Code skills for Bria AI - generate, edit, and transform images with Fibo, RMBG-2.0, and VGL structured prompts","skill_md_sha":"e4673e8ad2465443cc20250907949dde1cb3cf2e","skill_md_path":"skills/image-utils/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Bria-AI/bria-skill/tree/main/skills/image-utils"},"layout":"multi","source":"github","category":"bria-skill","frontmatter":{"name":"image-utils","license":"MIT","description":"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."},"skills_sh_url":"https://skills.sh/Bria-AI/bria-skill/image-utils"},"updatedAt":"2026-05-02T06:56:04.280Z"}}