Why your product photos look flatter online than on your camera
You photograph a product. On your camera's screen and on your laptop, the colour is rich. On the listing, it is noticeably duller: the reds especially.
Nothing was lost in compression. The image is not corrupted. What happened is that a set of numbers got reinterpreted.
Numbers do not mean anything on their own
A pixel is three numbers. RGB(255, 0, 0) is not "red" in any absolute sense, it means the most saturated red this colour space can describe. Which red that is depends entirely on which colour space is being talked about.
Display P3, which every recent iPhone and most modern cameras can shoot, describes a wider range of colours than sRGB. So P3's 255, 0, 0 is a genuinely more saturated red than sRGB's 255, 0, 0.
An image file records which space its numbers belong to, in an embedded colour profile. Software that reads the profile shows the intended colour. Software that ignores it shows the numbers as though they were sRGB.
When P3 numbers are read as sRGB, every colour comes out less saturated than intended. The image is not damaged, it is just being misread. Which is worse, in a way, because there is nothing visibly wrong to point at.
Why this hits e-commerce specifically
Almost every marketplace serves images as sRGB, and most convert on upload. The good ones convert properly. Others simply reinterpret, which is where the flatness comes from.
The problem also compounds. A photo edited on a P3 display, exported without a profile, uploaded and reinterpreted, can end up two conversions away from what you approved.
How to tell if this is your problem
The signature is specific: saturated colours suffer most, neutrals are unaffected. If your greys, whites and blacks look correct but your reds and greens look washed out, that is a profile problem, not an exposure problem.
If everything looks uniformly dull, that is more likely exposure or contrast, and colour management is not your issue.
Convert, assign, and the difference between them
Every serious editor offers both, usually next to each other in a menu, and they do opposite things.
Assign changes the label without touching the numbers. The pixel stays 255,0,0 and you are now claiming it means something different. Use it when a file has the wrong label: an sRGB image tagged as Adobe RGB, say.
Convert changes the numbers so the colour stays the same. A saturated P3 red becomes a different set of numbers that describe the closest red sRGB can reach. Use it when you want the appearance preserved.
Choosing "Assign sRGB" on a P3 file produces exactly the flatness described above, and it is an easy click to make by accident. If a menu offers both and you are unsure, you almost always want convert.
What actually happens in a conversion
Worth knowing, because it explains where conversions go wrong.
- Undo the tone curve. Stored pixel values are not proportional to light; they are stored on a curve so that the limited number of values available are distributed where the eye is most sensitive. This step reverses that, giving values proportional to actual light.
- Convert to a device-independent space. The RGB values, which mean nothing on their own, are turned into coordinates describing an actual colour.
- Adapt the white point, if the two spaces differ. This is the step naive conversions skip, and skipping it is why some converted images pick up a colour cast in the neutrals: the greys shift while everything else looks fine.
- Convert into the target space, and reapply its tone curve.
Steps 1 and 4 are the reason you cannot convert colours by multiplying the RGB values directly. Do the arithmetic on the stored values rather than on linear light and the errors are largest in the mid-tones, which is most of a product photograph.
What to do
Export as sRGB. The most reliable fix. Do the conversion yourself in a tool you trust, rather than leaving it to whoever receives the file. Every serious editor offers "Convert to sRGB" on export, and note that convert is different from assign, which just relabels the numbers and produces exactly the problem described above.
Keep the profile embedded. If you must ship a wider space, at least embed the profile so correct software has a chance. An untagged P3 file is guaranteed to be misread.
Check on a second device. A P3 display shows an untagged P3 image roughly correctly by accident, which is why the problem often only appears once someone else looks.
Testing whether you have a problem
Photograph a product with a strongly saturated colour: a red or an orange works best, since those are where P3 and sRGB differ most.
Export the same file twice: once converted to sRGB, once untagged. Open both in a browser and in your image viewer, side by side. If they look identical, your files are already sRGB and this is not your problem. If the untagged one looks duller, you have found it.
Then look at the same pair on a phone. Phones have wide-gamut screens, so an untagged wide-gamut file looks roughly right there by accident, which is precisely why the problem so often goes unnoticed until a customer mentions it.
A note on doing this properly
Converting between colour spaces is not a filter. It is a matrix multiplication in linear light, with tone curves applied on the way in and out, and a chromatic adaptation step if the two spaces have different white points.
That last part is where naive conversions go wrong: skip the adaptation and neutral greys pick up a colour cast, which is the most visible way a conversion can fail.
Done correctly, a converted image and the original describe the same colour in absolute terms, different numbers, same appearance. That is the test worth applying, and it is one you can verify numerically rather than by eye.