Zoom snapping on image load in mobile app #2760

Open
opened 2026-02-05 06:59:50 +03:00 by OVERLORD · 19 comments
Owner

Originally created by @Seon82 on GitHub (Apr 5, 2024).

Originally assigned to: @mertalev on GitHub.

The bug

In the mobile app, if you zoom in on a lower-res preview of an image, the view snaps to another region of the image when the full-scale image loads.

I assume the transformation would need to be recalculated to account for the new image dimensions.

The bug is demonstrated below, with the snapping happening at 0:05.

https://github.com/immich-app/immich/assets/46298009/80b1fe77-254a-4efe-bb96-959814eca323

The OS that Immich Server is running on

Debian 12

Version of Immich Server

v1.101.0

Version of Immich Mobile App

v.1.101.0 build.131, on android

Platform with the issue

  • Server
  • Web
  • Mobile

Your docker-compose.yml content

#
# WARNING: Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
#

name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    command: ['start.sh', 'immich']
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
#    ports:
#      - 2283:3001
    depends_on:
      - redis
      - database
    restart: unless-stopped
    networks:
      - caddy_net
      - default

  immich-microservices:
    container_name: immich_microservices
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/hardware-transcoding
      file: hwaccel.transcoding.yml
      service: quicksync # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    command: ['start.sh', 'microservices']
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    depends_on:
      - redis
      - database
    restart: always

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
     file: hwaccel.ml.yml
     service: openvino # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always

  redis:
    container_name: immich_redis
    image: registry.hub.docker.com/library/redis:6.2-alpine@sha256:51d6c56749a4243096327e3fb964a48ed92254357108449cb6e23999c37773c5
    restart: always

  database:
    container_name: immich_postgres
    image: registry.hub.docker.com/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: always

volumes:
  pgdata:
  model-cache:

networks:
  caddy_net:
    name: caddy_net
    external: true

Your .env content

# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your uploaded files are stored
UPLOAD_LOCATION=./library

# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=v1.101.0

# Connection secret for postgres. You should change it to a random password
DB_PASSWORD=[redacted]

# The values below this line do not need to be changed
###################################################################################
DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

REDIS_HOSTNAME=immich_redis

Reproduction steps

1. Open the mobile app
2. Open an image from an album
3. Zoom on the image before the full-size image loads
4. The view "jumps", gets offset when the full-size image gets loaded

Additional information

No response

Originally created by @Seon82 on GitHub (Apr 5, 2024). Originally assigned to: @mertalev on GitHub. ### The bug In the mobile app, if you zoom in on a lower-res preview of an image, the view snaps to another region of the image when the full-scale image loads. I assume the transformation would need to be recalculated to account for the new image dimensions. The bug is demonstrated below, with the snapping happening at 0:05. https://github.com/immich-app/immich/assets/46298009/80b1fe77-254a-4efe-bb96-959814eca323 ### The OS that Immich Server is running on Debian 12 ### Version of Immich Server v1.101.0 ### Version of Immich Mobile App v.1.101.0 build.131, on android ### Platform with the issue - [ ] Server - [ ] Web - [X] Mobile ### Your docker-compose.yml content ```YAML # # WARNING: Make sure to use the docker-compose.yml of the current release: # # https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml # # The compose file on main may not be compatible with the latest release. # name: immich services: immich-server: container_name: immich_server image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} command: ['start.sh', 'immich'] volumes: - ${UPLOAD_LOCATION}:/usr/src/app/upload - /etc/localtime:/etc/localtime:ro env_file: - .env # ports: # - 2283:3001 depends_on: - redis - database restart: unless-stopped networks: - caddy_net - default immich-microservices: container_name: immich_microservices image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/hardware-transcoding file: hwaccel.transcoding.yml service: quicksync # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding command: ['start.sh', 'microservices'] volumes: - ${UPLOAD_LOCATION}:/usr/src/app/upload - /etc/localtime:/etc/localtime:ro env_file: - .env depends_on: - redis - database restart: always immich-machine-learning: container_name: immich_machine_learning # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag. # Example tag: ${IMMICH_VERSION:-release}-cuda image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration file: hwaccel.ml.yml service: openvino # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable volumes: - model-cache:/cache env_file: - .env restart: always redis: container_name: immich_redis image: registry.hub.docker.com/library/redis:6.2-alpine@sha256:51d6c56749a4243096327e3fb964a48ed92254357108449cb6e23999c37773c5 restart: always database: container_name: immich_postgres image: registry.hub.docker.com/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 environment: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_USER: ${DB_USERNAME} POSTGRES_DB: ${DB_DATABASE_NAME} volumes: - pgdata:/var/lib/postgresql/data restart: always volumes: pgdata: model-cache: networks: caddy_net: name: caddy_net external: true ``` ### Your .env content ```Shell # You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables # The location where your uploaded files are stored UPLOAD_LOCATION=./library # The Immich version to use. You can pin this to a specific version like "v1.71.0" IMMICH_VERSION=v1.101.0 # Connection secret for postgres. You should change it to a random password DB_PASSWORD=[redacted] # The values below this line do not need to be changed ################################################################################### DB_HOSTNAME=immich_postgres DB_USERNAME=postgres DB_DATABASE_NAME=immich REDIS_HOSTNAME=immich_redis ``` ### Reproduction steps ```bash 1. Open the mobile app 2. Open an image from an album 3. Zoom on the image before the full-size image loads 4. The view "jumps", gets offset when the full-size image gets loaded ``` ### Additional information _No response_
OVERLORD added the 📱mobile label 2026-02-05 06:59:50 +03:00
Author
Owner

@aviv926 commented on GitHub (Apr 8, 2024):

I can't reproduce this problem, can you specify which phone you are using?
Are you experiencing this on other devices?

@aviv926 commented on GitHub (Apr 8, 2024): I can't reproduce this problem, can you specify which phone you are using? Are you experiencing this on other devices?
Author
Owner

@Seon82 commented on GitHub (Apr 8, 2024):

I have been able to reproduce the issue on a Samsung A54, Samsung A51, and Samsung Galaxy S7 Edge.
Additionally, I've verified that the problem persists when connecting the app to the demo immich instance.

@Seon82 commented on GitHub (Apr 8, 2024): I have been able to reproduce the issue on a Samsung A54, Samsung A51, and Samsung Galaxy S7 Edge. Additionally, I've verified that the problem persists when connecting the app to the demo immich instance.
Author
Owner

@aviv926 commented on GitHub (Apr 8, 2024):

I have been able to reproduce the issue on a Samsung A54, Samsung A51, and Samsung Galaxy S7 Edge. Additionally, I've verified that the problem persists when connecting the app to the demo immich instance.

In fact, I connected to the demo as well, went into the album and then the photo and did not experience this problem.
I also use Samsung.
Have you changed any app settings?

@aviv926 commented on GitHub (Apr 8, 2024): > I have been able to reproduce the issue on a Samsung A54, Samsung A51, and Samsung Galaxy S7 Edge. Additionally, I've verified that the problem persists when connecting the app to the demo immich instance. In fact, I connected to the demo as well, went into the album and then the photo and did not experience this problem. I also use Samsung. Have you changed any app settings?
Author
Owner

@Seon82 commented on GitHub (Apr 8, 2024):

That's weird - I can reproduce the issue with default settings.

@Seon82 commented on GitHub (Apr 8, 2024): That's weird - I can reproduce the issue with default settings.
Author
Owner

@bo0tzz commented on GitHub (Apr 8, 2024):

I just managed to reproduce this as well.

@bo0tzz commented on GitHub (Apr 8, 2024): I just managed to reproduce this as well.
Author
Owner

@fabianbees commented on GitHub (Apr 26, 2024):

Additionally I can also observe a second snapping, when the "load originals" option in the asset viewer settings is enabled.

In this case the first snapping occurs when the large preview was loaded and the second snap when the full resolution image was loaded.

@fabianbees commented on GitHub (Apr 26, 2024): Additionally I can also observe a second snapping, when the "load originals" option in the asset viewer settings is enabled. In this case the first snapping occurs when the large preview was loaded and the second snap when the full resolution image was loaded.
Author
Owner

@ZtereoHYPE commented on GitHub (Aug 12, 2024):

I can reproduce on both an iPad air 4th generation on iOS 17 and on a Google Pixel 8 on android 14. Immich v1.111.0

@ZtereoHYPE commented on GitHub (Aug 12, 2024): I can reproduce on both an iPad air 4th generation on iOS 17 and on a Google Pixel 8 on android 14. Immich v1.111.0
Author
Owner

@dan-farley commented on GitHub (Jan 29, 2025):

I'm able to consistently recreate this with my Immich on an iPhone 16, 18.2.1. I also tried it on a Google pixel and get the same results.

I have noticed that it's way more obvious specifically with my larger images from my DSLR. Those images are 10MB+. It's also even more obvious on a slower connection such as my cell network. It's more obvious because it takes longer to load and therefore ends up happing potentially 3-10 seconds after I zoomed in.

Sometimes it happens once, sometimes twice. It does seem to match up with it loading the preview image, and then loading the original image.

It feels like the "original" image dimensions are bigger than the "preview" generated by Immich, so therefore when it renders the original image to the canvas it's quite a bit larger than what was showing previously. But the zoom level should be scaling that same amount to conpensate..

Super annoying bug considering it happens with every photo I click.

@dan-farley commented on GitHub (Jan 29, 2025): I'm able to consistently recreate this with my Immich on an iPhone 16, 18.2.1. I also tried it on a Google pixel and get the same results. I have noticed that it's way more obvious specifically with my larger images from my DSLR. Those images are 10MB+. It's also even more obvious on a slower connection such as my cell network. It's more obvious because it takes longer to load and therefore ends up happing potentially 3-10 seconds after I zoomed in. Sometimes it happens once, sometimes twice. It does seem to match up with it loading the preview image, and then loading the original image. It feels like the "original" image dimensions are bigger than the "preview" generated by Immich, so therefore when it renders the original image to the canvas it's quite a bit larger than what was showing previously. But the zoom level should be scaling that same amount to conpensate.. Super annoying bug considering it happens with every photo I click.
Author
Owner

@alextran1502 commented on GitHub (Jan 29, 2025):

@dan-farley Do you have any special settings regarding the image viewer, like always load original image...etc? Can you post the screenshot of those settings from the mobile app?

@alextran1502 commented on GitHub (Jan 29, 2025): @dan-farley Do you have any special settings regarding the image viewer, like always load original image...etc? Can you post the screenshot of those settings from the mobile app?
Author
Owner

@dan-farley commented on GitHub (Jan 29, 2025):

@dan-farley Do you have any special settings regarding the image viewer, like always load original image...etc? Can you post the screenshot of those settings from the mobile app?

@alextran1502 Yes I am using the Preview and Original image settings. With those disabled it doesn't have the issue, but of course I want to be able to use those two settings for the higher quality.

image

@dan-farley commented on GitHub (Jan 29, 2025): > @dan-farley Do you have any special settings regarding the image viewer, like always load original image...etc? Can you post the screenshot of those settings from the mobile app? @alextran1502 Yes I am using the Preview and Original image settings. With those disabled it doesn't have the issue, but of course I want to be able to use those two settings for the higher quality. ![image](https://github.com/user-attachments/assets/ab03796d-2720-42a4-9de7-11765ca2d71e)
Author
Owner

@dan-farley commented on GitHub (Jan 29, 2025):

Here's a video I got of it as well.

https://streamable.com/xc3c9d

Definitely let me know if there's any other useful info to provide, or if you'd like a set of my images to try to recreate it.

@dan-farley commented on GitHub (Jan 29, 2025): Here's a video I got of it as well. https://streamable.com/xc3c9d Definitely let me know if there's any other useful info to provide, or if you'd like a set of my images to try to recreate it.
Author
Owner

@alextran1502 commented on GitHub (Jan 29, 2025):

@dan-farley, I think it makes sense since the original image will have a different resolution while the preview images are generated to similar-sized images, so you don't see the jump.

@alextran1502 commented on GitHub (Jan 29, 2025): @dan-farley, I think it makes sense since the original image will have a different resolution while the preview images are generated to similar-sized images, so you don't see the jump.
Author
Owner

@dan-farley commented on GitHub (Jan 29, 2025):

@alextran1502 Im not sure I'm following what you're saying. Are you saying that the behavior is expected?

@dan-farley commented on GitHub (Jan 29, 2025): @alextran1502 Im not sure I'm following what you're saying. Are you saying that the behavior is expected?
Author
Owner

@alextran1502 commented on GitHub (Jan 29, 2025):

@dan-farley Sorry, I wasn't watching the video, it looks like it only snaps while you zoom in. Does it snap when you view the photos without zooming in?

@alextran1502 commented on GitHub (Jan 29, 2025): @dan-farley Sorry, I wasn't watching the video, it looks like it only snaps while you zoom in. Does it snap when you view the photos without zooming in?
Author
Owner

@dan-farley commented on GitHub (Jan 29, 2025):

@alextran1502 Nope it functions fine if I don't zoom in, but of course that would mean I have to to wait multiple seconds for the original to load before I can interact with the image at all. However I would expect to be able to interact immediately, and then it smoothly swap to the original as it becomes available.

@dan-farley commented on GitHub (Jan 29, 2025): @alextran1502 Nope it functions fine if I don't zoom in, but of course that would mean I have to to wait multiple seconds for the original to load before I can interact with the image at all. However I would expect to be able to interact immediately, and then it smoothly swap to the original as it becomes available.
Author
Owner

@DawidPietrykowski commented on GitHub (Jan 31, 2025):

Can confirm, experiencing the same issue but only on mobile.

@DawidPietrykowski commented on GitHub (Jan 31, 2025): Can confirm, experiencing the same issue but only on mobile.
Author
Owner

@gavinwright-engr commented on GitHub (Sep 29, 2025):

This happens on every high resolution image I have in my library when viewed on my iPhone- please fix! Thank you!

@gavinwright-engr commented on GitHub (Sep 29, 2025): This happens on every high resolution image I have in my library when viewed on my iPhone- please fix! Thank you!
Author
Owner

@fabianbees commented on GitHub (Nov 4, 2025):

This issue can even be consistently reproduced without zooming at all.

Alternative way to reproduce

  1. Enable "Load original image"
  2. While being either on a slow connection and/or opening a rather large original image, do the following
  • click on the image in the timeline
  • open info panel form the bottom
  • wait until original has loaded (around 0:14 s in the video)
  • navigate back from info panel
  • snapping occurs

See:

https://github.com/user-attachments/assets/cb8cf7c0-b348-4e55-8d73-b315c8dbdbac

@fabianbees commented on GitHub (Nov 4, 2025): This issue can even be consistently reproduced without zooming at all. ## Alternative way to reproduce 1. Enable "Load original image" 2. While being either on a slow connection and/or opening a rather large original image, do the following - click on the image in the timeline - open info panel form the bottom - wait until original has loaded (around 0:14 s in the video) - navigate back from info panel - **snapping occurs** See: https://github.com/user-attachments/assets/cb8cf7c0-b348-4e55-8d73-b315c8dbdbac
Author
Owner

@flightmansam commented on GitHub (Dec 18, 2025):

I am experiencing this issue too! :)

@flightmansam commented on GitHub (Dec 18, 2025): I am experiencing this issue too! :)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: immich-app/immich#2760