Why JPG Colors Change Between Apps: ICC Profiles and Color Spaces

November 08, 2026 · HENRICK HEILESEN · JPEG Troubleshooting

Diagnose untagged images, sRGB, Display P3, Adobe RGB, browser and print color management.

Why JPEG Colors Shift Between Viewers

A JPEG file contains two separate pieces of color information. The first is the raw pixel data: numeric RGB triplets for every pixel (e.g., R=235, G=50, B=80). The second is an optional ICC profile embedded in the file header. This profile tells software, “Interpret these numbers as this specific shade under these viewing conditions.”

When an ICC profile is missing, applications must guess what the numbers mean. Most browsers and operating systems assume untagged images use sRGB. If the image was actually edited in Adobe RGB or Display P3, that assumption is wrong. The same RGB values produce different visible colors when interpreted against a different color space.

The failure mode is consistent: you see correct color only in the application that knows the intended profile (typically the editing software where the file was last saved). Everywhere else, the RGB numbers get reinterpreted against a different reference, and the appearance shifts.

The JPEG standard (ITU-T T.81, Sections K.1–K.6) defines the syntax for application marker segments that carry color space information, but the standard does not mandate any specific color space or require ICC embedding. That decision is left to the encoder and the surrounding application ecosystem.

Diagnosing an Untagged Image

Before converting or embedding anything, determine what the file actually contains.

Check for an Embedded Profile

  • Windows: Right-click the file → Properties → Details. Look for “Color space” or “ICC profile name.” If absent, the image is untagged.
  • macOS: Open in Preview → Tools → Show Inspector → More Info. If “Color Profile” is blank or missing, the image is untagged.
  • ExifTool (command-line): Run exiftool -ICCProfileName yourfile.jpg. No output means no profile is embedded.

Identify the Actual Color Space of the Pixel Data

An untagged JPEG may still contain pixel data authored in a wide-gamut space. To investigate:

  • Open the file in Photoshop, GIMP, or Affinity Photo.
  • Check the document’s assigned profile in the status bar, info panel, or Color Settings dialog.
  • If the editor displays “sRGB IEC61966-2.1” without a profile mismatch warning, the application assumed sRGB because no profile was found. The underlying pixel values may still represent Adobe RGB or Display P3 primaries.

Explicit limitation: No reliable automated method exists to reverse-engineer the intended color space of an untagged JPEG. You must infer it from the source: camera model defaults, known editing software export settings, or workflow documentation. Guessing incorrectly and converting will compound the error.

sRGB, Adobe RGB, and Display P3: When Each Applies

sRGB (IEC 61966-2-1)

The universal safe choice. Every web browser, social media platform, and consumer operating system treats untagged images as sRGB.

  • Use for: Web delivery, email, mobile apps, e-commerce listings, social media.
  • Gamut limitation: Cannot encode the deep greens or vivid cyans that a wide-gamut monitor can display. Those colors get clipped or compressed during conversion.

Adobe RGB (1998)

Wider gamut in greens and cyans. Used in professional photography workflows destined for high-end offset or inkjet print.

  • The trap: Exporting to Adobe RGB without embedding the profile causes every non-color-managed application to display the image as if it were sRGB. The result is desaturated, flat color across the entire image.

Display P3

Used by Apple devices (iPhone, iPad, Mac), many Android flagships, and recent external monitors. Derived from DCI-P3 but with an sRGB-style transfer function.

  • The trap: Display P3 is wider than sRGB but narrower than Adobe RGB in some cyan-green regions. Converting a Display P3 image to sRGB without a profile shifts reds and skin tones noticeably.

Decision rule: If you do not control where the image will be viewed, embed an sRGB profile. If you must preserve a wider gamut for print, embed the correct source profile and verify the result in a color-managed browser (Firefox or Safari; Chrome requires a flag or extension for full support).

Repairing Mismatched Colors Without Re-Editing

This workflow applies when you have an untagged JPEG that looks correct only inside your editor.

Step 1: Assign the Suspected Profile (Do Not Convert)

In your editor, assign the profile you believe was originally used:

  • Photoshop: Edit → Assign Profile → select the candidate (e.g., Adobe RGB).
  • GIMP: Image → Color Management → Assign Color Profile.

The on-screen appearance will change immediately. If the image looks correct after assignment, you identified the right profile. If it looks worse, undo and try a different candidate.

Step 2: Convert to the Target Profile

Once the correct source profile is assigned, convert to the destination space:

  • Photoshop: Edit → Convert to Profile → select sRGB IEC61966-2.1 (for web) or the printer’s requested space.
  • GIMP: Image → Color Management → Convert to Color Profile.

This step remaps the RGB numbers so the image appears the same on the target display as it did in the original wide-gamut context. The numeric values change; the intended appearance is preserved.

Step 3: Save with the Profile Embedded

  • Photoshop: File → Save a Copy → check “ICC Profile: sRGB IEC61966-2.1.”
  • GIMP: File → Export As → check “Save color profile.”
  • Do not rely on browser-based tools for this step; use a full image editor.

What this cannot recover: If the JPEG was saved multiple times without a profile, each generation discarded gamut and tonal information. Converting an untagged file from an assumed sRGB state into a wider space will not restore lost color—it will only stretch the existing data across a larger gamut, producing distortion.

Why Browsers and Print Services Produce Different Results

Browser Behavior

  • Safari and Firefox: Fully color-managed. Both read embedded ICC profiles and display images accordingly. They also apply the display’s own profile for final output.
  • Chrome and Edge: Color-managed only for images that carry an embedded profile. Untagged images are treated as sRGB with no further mapping.
  • Observed failure: An Adobe RGB JPEG with an embedded profile may appear oversaturated in Safari (which honors the profile and maps it to the display) but muted in Chrome (which may ignore the profile depending on version and flags). An untagged Adobe RGB JPEG will look desaturated in both, because both default to sRGB for untagged content.

Print Service Behavior

  • Consumer print services (drugstore kiosks, Shutterfly, Vistaprint) convert all uploads to sRGB internally. Uploading an Adobe RGB file causes their pipeline to either clip out-of-gamut colors (loss of detail in saturated regions) or apply a naïve conversion that produces muddy output.
  • Professional print shops (giclee, fine art) expect a tagged file in a known working space. Confirm with the shop: “Do you want sRGB, Adobe RGB, or ProPhoto RGB?” Embed that exact profile in the delivered file.

The JPEG standard (ITU-T T.81, Annex B) describes the APP1 marker used by Exif and ICC profiles. Print RIPs and browser engines that support color management parse this marker to map pixel values to device output. When the marker is absent, the application falls back to its own default—sRGB for most, but not universally.

Export Settings That Strip the Profile

A common scenario: you export from Lightroom with “sRGB” selected, yet the file still looks wrong elsewhere. The cause is often a metadata-stripping option enabled alongside the color space choice.

  • Lightroom Classic: The “Minimize Embedded Metadata” checkbox (in the Metadata section of the Export dialog) removes the ICC profile. “Limit File Size” does not strip the profile.
  • Photoshop “Save for Web” (Legacy): The “Convert to sRGB” checkbox does not guarantee the profile is embedded. The legacy Save for Web dialog strips the ICC profile unless “Embed Color Profile” is explicitly checked. Use “Export As” instead, which preserves the profile when “Embed Color Profile” is selected.
  • ImageMagick: The command convert input.jpg -profile sRGB.icc output.jpg applies the specified profile. If the image already has an embedded profile, this operation converts from the embedded profile to sRGB. Applying a profile that does not match the intended destination space will double-convert and produce incorrect color.

Verification: After export, run exiftool -ICCProfileName yourfile.jpg. If the command returns nothing, the profile was stripped during export.

When Color Shift Is Unavoidable

Some workflows cannot preserve exact color across every viewing context. Recognize these limits and plan accordingly.

  • HEIC-to-JPEG conversion: HEIC files from iPhones use a Display P3 color space. Converting to JPEG without embedding a profile forces an sRGB assumption, shifting reds and skin tones. The fix: convert to sRGB and embed the profile during conversion, not afterward.
  • AI-generated images: Stable Diffusion and Midjourney output untagged sRGB by default. If a wide-gamut source image is used as input, the output may inherit the input’s gamut without the corresponding profile. Inspect every AI-generated image and assign sRGB explicitly before distribution.
  • Grayscale and duotone images: These often carry no embedded profile. Assign a grayscale gamma profile (e.g., Gray Gamma 2.2) to prevent tinting when viewed in color-managed applications.

Practical takeaway: When you cannot guarantee a color-managed pipeline (email attachments, messaging apps, social media uploads), embed sRGB and accept that wide-gamut content will be compressed to fit. That compression is less visually disruptive than a complete color cast caused by a missing profile.

Technical basis for Why JPG Colors Change Between Apps

Structural claims in this guide are grounded in the primary JPEG technical reference.