Skip to content

Fix QField Camera orientation by adding user-controlled rotation + persisted setting#7028

Open
kaustuvpokharel wants to merge 8 commits intomasterfrom
bug/cameraOrientation
Open

Fix QField Camera orientation by adding user-controlled rotation + persisted setting#7028
kaustuvpokharel wants to merge 8 commits intomasterfrom
bug/cameraOrientation

Conversation

@kaustuvpokharel
Copy link
Collaborator

@kaustuvpokharel kaustuvpokharel commented Feb 6, 2026

This PR tackles the inconsistent QtCamera photo orientation (auto-orientation / azimuth-related mismatch) by introducing a simple manual override that the user can set once and keep.

What changed

  1. QML: “Phone rotate” control
  • Adds a “Phone rotate” button that appears only on mobile and only when the device is not in portrait (landscape / rotated mode).
  • Lets users pick the correct orientation (and preview/try alternatives).
  • Persists the chosen rotation via Settings, so the app consistently applies the user’s preference on future captures.
  1. C++: rotate saved image for consistency
  • Applies the same selected rotation to the captured image file (pixels are rotated and orientation tags normalized) so that:

    • QML preview and external viewers match
    • EXIF orientation doesn’t cause double-rotation

Why

QtCamera / platform auto-orientation is unreliable across devices, and I can understand why qt cannot come with a rigid fix for this, as there are thousands of devices with different mechanism within it and for one universal fix. Persisting a user-selected rotation is a pragmatic fallback that prevents repeated wrong-orientation captures without forcing a single hardcoded behavior.

Issue related that could (perhaps) be fixed with this: #7005 #5820 #5224

Demo:

trim.DFE5F7DA-4005-484F-9953-545DF3ACAD8E.MOV

@kaustuvpokharel kaustuvpokharel force-pushed the bug/cameraOrientation branch 2 times, most recently from 769ce8a to 239edd6 Compare February 6, 2026 23:31
@kaustuvpokharel kaustuvpokharel changed the title Fix QtCamera orientation by adding user-controlled rotation + persisted setting Fix QField Camera orientation by adding user-controlled rotation + persisted setting Feb 6, 2026
@qfield-fairy
Copy link
Collaborator

qfield-fairy commented Feb 6, 2026

🍎 MacOS DMG universal builds

Download a MacOS DMG universal build of this PR for testing.
(Built from commit f338caf)

📱 Android builds

Download an Android arm64 build of this PR for testing.
(Built from commit f338caf)

Other Android architectures

🪟 Windows builds

Download a Windows build of this PR for testing.
(Built from commit f338caf)

🐧 Linux AppImage builds

Download a Linux AppImage build of this PR for testing.
(Built from commit f338caf)

@kaustuvpokharel kaustuvpokharel self-assigned this Feb 7, 2026
@nirvn
Copy link
Member

nirvn commented Feb 8, 2026

@kaustuvpokharel , nice one -- can you rebase?

Copy link
Collaborator

@mohsenD98 mohsenD98 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work @kaustuvpokharel 👍 , just 2 comment

}

// normalize to [0, 359]
int deg = ( clockwiseDegrees % 360 ) + 90; //somehow, the offset is - 90degree, if added 90" it keeps the previewed orientation from qml
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, this line caught my attention, so I just did this test — not sure whether it's the correct behavior or not.

  • Landscape mode
  • I set rotation to 90°
  • Preview is fine, then I capture
  • The result contains an extra 90° of rotation
mohsen.mp4

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was a problem, because it seems EXIF orientation varies by device. Also, EXIF=1 means different things on different devices, so I thought it could be universal, but it varies from device to device, so now I handled it
by physically rotating the pixels and reset EXIF to 1 so it remains universal.

@mohsenD98 would you please try to build this branch again and see if videoPreview->photoPreview->and captured image are in the same orientation or not, it is good for my device, but just want to cross check just in case! Thanks for your review here.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’ve just tested it, @kaustuvpokharel

✔️ Photo capture works correctly now - the captured image orientation is consistent with the preview (Good job!) 👍

But Video recording currently has two issues:

  1. Rotation is completely ignored. Whether the device is at 90°, 180°, or 270°, the recorded video is always saved without applying any rotation.
Screenrecorder-2026-02-14-17-05-36-319.mp4
  1. On the second recording attempt, the result is not displayed at all in a strange way. I’m not fully sure whether the current PR causes this or if it’s an unrelated issue, but I wanted to mention it just in case.
Screenrecorder-2026-02-14-17-06-09-352.mp4

The result is not displayed:

image

@mohsenD98
Copy link
Collaborator

and these 2 icons are so similar, specially in small screens:
Image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants