Q:

Как сконвертировать в sRGB картинку с профилем ICC и удалить сам профиль? 

Делаю веб-сайт на питоне, в админке которого можно загружать картинки на сайт.  Обнаружилось, что если загружать JPEG-фотки с хорошего фотоаппарата, то на сайте фотки отображаются менее насыщенными, чем они отображаются во всяких фотошопах, хотя никакой их обработки никем не производилось. 
Выяснилось, что JPEG-фотки имеют профиль ICC, отличающийся от стандартного sRGB (если конкретно, ProPhoto RGB), а браузеры этот профиль использовать не умеют и отображают цвета как попало. 
Отсюда задача: c помощью Pillow (на сайте используется он) перевести картинку в обычный sRGB и убрать профиль ICC из неё, чтоб не мешался. 

A:

За работу с цветовыми профилями в Pillow отвечает модуль PIL.ImageCms (использует в своей основе библиотеку Little CMS), и его метод profileToProfile позволяет конвертировать картинки из одного профиля в другой — вот в sRGB и сконвертируем. 
У меня получилась такая функция, которая умеет обрабатывать как минимум JPEG и PNG (протестировано на Pillow 7.2):
from io import BytesIO
from PIL import Image, ImageCms

def remove_icc(image: Image. Image, in_place: bool = False) -> Image. Image:
    """
    Убирает у картинки ICC-профиль и ставит обычный sRGB, который
    не имеет проблем с отображением на разных устройствах. 

    При in_place=False возвращает или новую сконвертированную картинку, если
    профиль был, или просто копию оригинала с удалённым профилем, если профиль
    изначально был sRGB или профиля вообще не было. 

    При in_place=True конвертирует картинку на месте без создания копии
    и возвращает её же — это помогает экономить память. 
    """

    icc_bytes = image.info.get("icc_profile") or b""
    if not icc_bytes:
        # Если ICC-профиля нет, то просто возвращаем копию картинки
        return image if in_place else image.copy()

    # Читаем ICC-профиль из картинки
    orig_icc = ImageCms.getOpenProfile(BytesIO(icc_bytes)).profile
    # Получаем обычный профиль sRGB, в который будем конвертировать
    srgb_icc = ImageCms.createProfile("sRGB")

    if in_place:
        # Конвертируем один профиль в другой на месте без создания копии
        ImageCms.profileToProfile(image, orig_icc, srgb_icc, inPlace=True)
        # Удаляем информацию о профиле sRGB, чтобы всякие гимпы
        # не предлагали сконвертировать sRGB в sRGB
        image.info.pop("icc_profile")
        return image

    # При in_place=False создаём сконвертированную копию картинки
    result = ImageCms.profileToProfile(image, orig_icc, srgb_icc, inPlace=False)
    result.info.pop("icc_profile")

    # Имейте в виду, что profileToProfile при создании копии картинки
    # не переносит мета-информацию вроде EXIF.  Если она вам нужна, придётся
    # позаботиться о её копировании самостоятельно
    if image.info.get("exif"):
        result.info["exif"] = image.info["exif"]

    return result

Метод profileToProfile также имеет другие аргументы, которые могут быть вам интересны; подробнее см.  в документации Pillow.