Color Profiles ICC: sRGB, Adobe RGB, P3 and CMYK
Color is relative. The same RGB value produces different colors on different screens and devices. ICC color profiles mathematically describe what color each numerical value represents.
What Is an ICC Color Profile?
An ICC profile (.icc or .icm) describes the color space of a device or image:
- Source profile: describes colors as stored in the image
- Destination profile: describes colors a device can reproduce
- Color Management Module (CMM): converts between profiles maintaining visual appearance
Most Common Color Spaces
sRGB — The Internet Standard
- Created by HP and IEC in 1996 as a universal standard
- Almost all devices and web browsers assume sRGB
- Limited color gamut
- When to use: web images, social media, general use
Adobe RGB (1998) — Professional Photography
- Gamut ~35% wider than sRGB, especially in greens and cyans
- Only advantageous if the entire chain supports Adobe RGB
- When to use: studio photography, high-quality offset printing
Display P3 — Modern Screens
- Gamut ~25% wider than sRGB
- Standard on iPhone (since 6s), Mac Retina (since 2016)
- CSS support: color(display-p3 r g b)
- When to use: Apple devices, HDR, modern OLED
CMYK — For Printing
- Subtractive model for paper printing
- Common profiles: Coated Fogra39 (Europe), SWOP v2 (US), Japan Color 2001
Convert Profiles with Python (Pillow)
from PIL import Image, ImageCms
# View embedded profile
with Image.open("photo.jpg") as img:
profile_data = img.info.get('icc_profile')
if profile_data:
import io
profile = ImageCms.ImageCmsProfile(io.BytesIO(profile_data))
print(ImageCms.getProfileName(profile))
else:
print("No ICC profile (sRGB assumed)")
sRGB to Adobe RGB
from PIL import Image, ImageCms
def srgb_to_adobe_rgb(input_path, output_path):
srgb = ImageCms.createProfile("sRGB")
adobe = ImageCms.createProfile("AdobeRGB1998")
with Image.open(input_path) as img:
if img.mode != "RGB":
img = img.convert("RGB")
transform = ImageCms.buildTransformFromOpenProfiles(
srgb, adobe, "RGB", "RGB",
renderingIntent=ImageCms.Intent.RELATIVE_COLORIMETRIC
)
converted = ImageCms.applyTransform(img, transform)
profile_bytes = ImageCms.getOpenProfile(adobe).tobytes()
converted.save(output_path, icc_profile=profile_bytes)
srgb_to_adobe_rgb("photo.jpg", "photo_adobergb.jpg")
RGB to CMYK with Real ICC Profile
from PIL import Image, ImageCms
import io
def rgb_to_cmyk(input_path, output_path, cmyk_profile_path):
srgb = ImageCms.createProfile("sRGB")
with open(cmyk_profile_path, "rb") as f:
cmyk = ImageCms.ImageCmsProfile(io.BytesIO(f.read()))
with Image.open(input_path) as img:
if img.mode != "RGB":
img = img.convert("RGB")
transform = ImageCms.buildTransformFromOpenProfiles(
ImageCms.getOpenProfile(srgb), cmyk,
"RGB", "CMYK",
renderingIntent=ImageCms.Intent.RELATIVE_COLORIMETRIC
)
cmyk_img = ImageCms.applyTransform(img, transform)
cmyk_img.save(output_path, format="TIFF") # TIFF supports CMYK correctly
# Download Fogra profiles from https://www.eci.org/
rgb_to_cmyk("design.png", "design_cmyk.tif", "Fogra39L.icc")
Embed sRGB Profile
from PIL import Image, ImageCms
def embed_srgb(input_path, output_path):
srgb = ImageCms.createProfile("sRGB")
profile_bytes = ImageCms.getOpenProfile(srgb).tobytes()
with Image.open(input_path) as img:
img.save(output_path, icc_profile=profile_bytes)
embed_srgb("without_profile.jpg", "with_srgb.jpg")
Convert with ImageMagick
# View color profile
identify -verbose photo.jpg | grep -i "colorspace\|icc\|profile"
# sRGB -> CMYK with Fogra39
convert photo.jpg -profile /path/sRGB.icc -profile /path/Fogra39.icc photo_cmyk.tif
# CMYK -> sRGB
convert photo_cmyk.tif -profile /path/Fogra39.icc -profile /path/sRGB.icc photo_rgb.jpg
# Embed sRGB profile
convert without_profile.jpg -profile /path/sRGB.icc with_profile.jpg
# Remove ICC profile (for web)
convert photo.jpg -strip photo_no_profile.jpg
Common Problems
"Colors look muted when exporting"
Cause: image is in Adobe RGB but viewer interprets as sRGB. Solution: convert to sRGB before publishing on the web.
"Print colors don't match the screen"
Causes: uncalibrated screen, sRGB file sent to printer expecting CMYK Fogra39, no ICC profile. Solution: ask the printing service for their machine ICC profile and convert with that profile.
"PDF changes the colors"
Solution: export PDF/X-4 with embedded ICC profiles.
Color Management Tools
| Tool | Use |
|---|---|
| Adobe Photoshop | Full professional color management |
| GIMP | Basic color management (LittleCMS) |
| darktable | RAW workflow with professional color |
| ArgyllCMS + DisplayCAL | Open-source monitor calibration |
Convert Online
To convert between image formats with proper color management, KaijuConverter processes images preserving ICC profiles where possible.
Related conversions
Most teams that read this guide convert images in one of these directions: