Skip to content

HEIF HDR (BT.2020 / PQ) exported from Photomator generates flat SDR thumbnails, original renders correctly #26581

@DirkToelz

Description

@DirkToelz

I have searched the existing issues, both open and closed, to make sure this is not a duplicate report.

  • Yes

The bug

Description:
Thumbnail format: WebP
Wide gamut option: Enabled

I noticed that HEIF HDR images (BT.2020 / SMPTE ST 2084 PQ) exported from Photomator generate flat/desaturated thumbnails in Immich.

However:
• The original file renders correctly in Safari (HDR “blink” effect visible).
• iPhone-native HEIF HDR images generate correct thumbnails.
• JXL HDR images also generate correct thumbnails.
• Only Photomator-exported HEIF HDR files are affected.

The issue appears to be limited to thumbnail generation. When opening the asset, the full-resolution image displays correctly in HDR.

Technical Details:
Both the iPhone HEIF HDR files and the Photomator HEIF HDR files report:
• Color primaries: BT.2020
• Transfer function: SMPTE ST 2084 (PQ)
• HDR format: HDR10
The difference seems to occur during Immich thumbnail generation (likely ffmpeg tone mapping or metadata interpretation).

Additional Notes
• Existing older HEIF HDR images (generated previously) still have correct thumbnails.
• JXL HDR thumbnails are generated correctly.
• The issue started after updating Immich approximately two weeks ago.

Please let me know if sample files or ffprobe output would help.

The OS that Immich Server is running on

Deployment: Docker (Ubuntu 24.04 host)

Version of Immich Server

v2.5.6

Version of Immich Mobile App

iOS 2.5.6 build 246

Platform with the issue

  • Server
  • Web
  • Mobile

Device make and model

Apple MacBook Pro M1 - Safari, iPhone 15 ProMax

Your docker-compose.yml content

ervices:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    restart: always
    ports:
      - "2283:2283"
    environment:
      - DB_USERNAME=${DB_USERNAME}
      - DB_PASSWORD=${DB_PASSWORD}
      - DB_DATABASE_NAME=${DB_DATABASE_NAME}
      - DB_HOST=database
      - REDIS_HOST=redis
      - UPLOAD_LOCATION=${UPLOAD_LOCATION}
      - IMMICH_SERVER_URL=${IMMICH_SERVER_URL}
      - TZ=${TZ}
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /srv/immich/model-cache:/usr/src/app/model-cache
    depends_on:
      - database
      - redis
      - immich-machine-learning
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "3"

  immich-machine-learning:
    image: ghcr.io/immich-app/immich-machine-learning:release
    restart: always
    environment:
      - TZ=${TZ}
    volumes:
      - /srv/immich/model-cache:/cache
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "3"

  database:
    # CHANGED: pgvecto.rs -> VectorChord (Postgres 16)
    image: ghcr.io/immich-app/postgres:16-vectorchord0.3.0-pgvectors0.2.0
    restart: always
    environment:
      - POSTGRES_USER=${DB_USERNAME}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_DATABASE_NAME}
      - TZ=${TZ}
    volumes:
      - /srv/immich/postgres:/var/lib/postgresql/data
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "3"

  redis:
    image: redis:7
    restart: always
    environment:
      - TZ=${TZ}
    command: ["redis-server","--appendonly","yes"]
    volumes:
      - /srv/immich/redis:/data
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "3"

networks:
  default:
    name: immich_default

Your .env content

# ========================
# Immich .env
# ========================

# Upload-Ordner auf der Synology (NFS-Mount)
UPLOAD_LOCATION=/mnt/redacted

# Datenbank
DB_USERNAME=immich
DB_PASSWORD=<redacted>
DB_DATABASE_NAME=immich

# Zeitzone
TZ=Europe/Berlin

# Interne API-URL (Immich-Server hört extern auf 2283)
IMMICH_SERVER_URL=https://immich.example.tld

Reproduction steps

...

Relevant log output

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    To triage

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions