> For the complete documentation index, see [llms.txt](https://mapir.gitbook.io/chloros/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mapir.gitbook.io/chloros/image-viewer-gui/opening-an-image-full-screen.md).

# Opening an Image Full Screen

<figure><img src="https://1328410239-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOlCbgXiWzMtaOKj49kpf%2Fuploads%2FlTqxj0FEfNNuWSSRUZ6y%2Fimage.png?alt=media&amp;token=a6257418-eeb9-4f7b-82fb-4f3f8ffdd7f2" alt=""><figcaption><p>An image opened full screen, with the layer selector top-right</p></figcaption></figure>

The Chloros Image Viewer is the full-screen interface for viewing, inspecting and measuring your images. It is where you read **real pixel values** — per-channel DN, reflectance percent, or radiance in W/m²/sr/nm — rather than the stretched preview the screen is painting.

## Accessing the Image Viewer

### From the File Browser

1. Open the **File Browser** tab <img src="https://1328410239-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOlCbgXiWzMtaOKj49kpf%2Fuploads%2Fgit-blob-65a5d12fb868533fcc66abebb71865d48a50f35f%2Ficon_file-browser.JPG?alt=media" alt="" data-size="line">
2. Click any **thumbnail** in the [image grid](/chloros/image-viewer-gui/image-grid.md)
3. The image opens full screen in the **Image Viewer** tab

The image opens on whichever product the grid was showing. If the grid is set to `RAW (Reflectance)`, that is the layer you land on.

### Opening the Image Viewer sidebar

Click the **Image Viewer** <img src="https://1328410239-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOlCbgXiWzMtaOKj49kpf%2Fuploads%2Fgit-blob-61f7b64995600417b62eb916ea2c22ddf4c7738f%2Ficon_image-viewer.JPG?alt=media" alt="" data-size="line"> icon in the left sidebar to slide out the analysis panel. It contains, top to bottom:

* the image name and its camera model
* the **Export/Save Image(s)** button (only once an Index or LUT is active)
* the **Index** and **LUT** checkboxes and the index configuration panel — see [Index/LUT Sandbox](/chloros/image-viewer-gui/index-lut-sandbox.md)
* the **Cursor Values** panel: per-channel readout, layer histogram, and the GSD control

***

## Navigating and zooming

### Browse through images

* **Next image**: the → button, or the **→** (Right Arrow) key
* **Previous image**: the ← button, or the **←** (Left Arrow) key
* **Jump to a specific image**: go back to the grid and click its thumbnail

Zoom and pan persist as you move between images, so you can step through a set while staying on the same part of the frame.

### Zoom

Zoom is driven by the **mouse wheel**, in 15% steps, anchored on the cursor — the point under the pointer stays under the pointer. The range is bounded by the image and window size: you cannot zoom out past fit-to-window, and the upper bound is set by the image's native resolution.

There are no dedicated zoom keys in the full-screen viewer. (In the grid, **Ctrl + `+` / `−`** resizes thumbnails — a different control.)

### Pan when zoomed

Click and hold the left mouse button over the image and drag. Panning is limited so the image cannot be dragged off screen.

### Per-pixel inspection at high zoom

Once the effective magnification passes **60×**, Chloros draws a highlight box around the individual displayed pixel under the cursor and a floating value next to it.

"Effective" magnification counts the GSD block size: with a block size of 8, the highlight appears at 7.5× zoom rather than 60×, because one displayed pixel is already 8 × 8 source pixels. Zoom back out below the threshold and the highlight disappears.

### Keyboard shortcuts

| Key                             | Where       | Action                              |
| ------------------------------- | ----------- | ----------------------------------- |
| **→**                           | Full screen | Next image                          |
| **←**                           | Full screen | Previous image                      |
| **Ctrl + R**                    | Full screen | Reset the index/LUT sandbox         |
| **Ctrl + `+`** / **Ctrl + `=`** | Grid        | Larger thumbnails (4 px per press)  |
| **Ctrl + `−`**                  | Grid        | Smaller thumbnails (4 px per press) |

***

## Cursor Values

Move the cursor over the image and the **Cursor Values** panel reports the value of every channel under it.

{% hint style="success" %}
**These are the file's real numbers.** The canvas on screen is an 8-bit stretched preview and cannot supply them, so Chloros samples the actual product file for the readout. That is why a 12-bit raw frame reports values above 255, and why a float32 radiance layer reports physical units.
{% endhint %}

### What the columns mean

The panel adapts to the layer you are viewing:

| Layer you are viewing              | Columns shown    | Notes                                                                                           |
| ---------------------------------- | ---------------- | ----------------------------------------------------------------------------------------------- |
| Reflectance                        | **DN** and **%** | Percent is computed with that file's own scale — see below                                      |
| Radiance                           | **W/m²/sr/nm**   | Float physical values; no DN column, because a DN is meaningless here                           |
| Raw / Debayered / preview / JPG    | **DN**           | Integer digital numbers                                                                         |
| 32-bit percent reflectance exports | **%** only       | The stored float is not a DN, so rounding it to an integer would print a meaningless `0` or `1` |

Each row is labelled with the channel name for your camera's filter — `Red / Green / NIR` for RGN, `Orange / Cyan / NIR` for OCN, `NIR / Green / Blue` for NGB, `Red / Green / Blue` for RGB, and the single band name for RE, NIR and mono M3M cameras. Each label carries a coloured dot matching the channel circles used in the index formula editor.

Saved **index and LUT** images are a special case: they hold colour-map components rather than spectral bands, so their rows are labelled `Red / Green / Blue` (or `Index` for a single-channel index file) rather than with the camera's filter names.

When an index is active in the sandbox, an extra row appears below the channels showing the **index value** at the cursor, with the index's name and a white dot that matches its marker on the histogram.

### Reflectance percent uses each file's own scale

{% hint style="warning" %}
**Do not assume 65535 = 100%.** Chloros stores reflectance at different scales depending on which camera produced it, and the viewer resolves the correct one per file.
{% endhint %}

| Source                  | DN that equals reflectance 1.0 | How it is identified                                                                                                                               |
| ----------------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **LATTICE** (M3C / M3M) | **32768**                      | XMP tag `Chloros:PixelScale=32768` written into every LATTICE reflectance export. The 2× headroom lets the file carry ρ above 1.0 without clipping |
| **Survey3**             | **65535**                      | No Chloros XMP scale tag — Survey3 calibration writes ρ × dtype-max and clips at 1.0                                                               |

The viewer, the index/LUT sandbox and the index export all resolve the scale through the same single implementation, so a value you read at the cursor is the same value the index math used.

Two consequences worth knowing:

* A **32-bit percent** TIFF stores DN/65535 as a float, and an **8-bit** PNG/JPG export stores DN × 255/65535 — the viewer converts both back before printing a percent.
* One case cannot be recovered: an **8-bit TIFF export of an 8-bit-source capture** is clipped to 0–255 rather than rescaled, and deliberately carries no scale tag. For those files the panel prints DN only, with no percent column. This is the honest answer, not a bug.

***

## The layer histogram

Below the cursor rows is a live histogram of the layer you are viewing, in **256 bins**. By default it draws one combined curve, weighted `(R + 2G + B) / 4` — the same measurement space the LATTICE camera histograms use. Turning **RGB** on replaces it with per-channel curves in the channel colours, additively blended so overlaps stay readable. Mono layers always draw the single curve.

The horizontal axis is in the layer's own unit:

| Layer       | Axis unit  | Axis maximum                                               |
| ----------- | ---------- | ---------------------------------------------------------- |
| Reflectance | percent    | 125% — the product's headroom allows ρ above 1.0           |
| Radiance    | W/m²/sr/nm | The frame's own peak, rounded up to two significant digits |
| 8-bit data  | DN         | 255                                                        |
| 12-bit data | DN         | 4095                                                       |
| 16-bit data | DN         | 65535                                                      |

When the axis is in DN and lands on one of those three ceilings, Chloros also knows the bit depth of what you are looking at.

Three buttons sit above the histogram:

| Button     | Default | Effect                                                                                                                                                                                                                                                                                   |
| ---------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **CURSOR** | On      | Draws marker lines on the histogram at the exact values shown in the rows above, so you can see where the pixel under your cursor sits in the frame's distribution. In RGB mode there is one marker per channel in its own colour; otherwise a single white marker at the combined value |
| **INDEX**  | On      | Appears only while an index is active. Switches the histogram from the source bands to the **index value distribution**, with the two clip thresholds drawn as orange dashed lines and the cursor's index value as a white line                                                          |
| **RGB**    | Off     | Switches from the combined curve to per-channel curves. On a mono sensor this button reads **MONO** and is disabled — there is only one channel to show                                                                                                                                  |

The histogram is computed on the **blocks you can see**, not the source pixels behind them: change the GSD block size and the distribution recomputes, so the histogram, the cursor marker and the displayed image always agree.

***

## GSD block size

At the bottom of the panel is the **GSD (px)** control: a number box, a slider from **1 to 256**, and a **RESET** button.

It coarsens the *displayed* image by averaging an N × N block of source pixels into one displayed pixel. `1` is native resolution.

* It affects **the full-screen view, the grid thumbnails, the cursor readout, and both histograms** — everything that shows the image agrees on the same ground resolution.
* It is **display only**. Processing and export are untouched. The one exception is a deliberate one: an [Index/LUT Sandbox](/chloros/image-viewer-gui/index-lut-sandbox.md) export saves what you are looking at, so it carries the current block size, and the export panel warns you when the block size is above 1.
* The value is stored **per project** as `viewer_display.gsd_bin` in `project.json`, so it survives closing and reopening.
* The cursor readout reports the block, not the source pixel, whenever the block size is above 1 — the value shown is the mean of the block under your cursor.

{% hint style="info" %}
**Why "block size" and not centimetres per pixel?** A cm/px figure needs a height above ground. A single frame's EXIF carries GPS altitude above mean sea level, not above the terrain it was pointed at, so Chloros will not print a ground distance it cannot honestly derive. The block size in source pixels is the same fallback the MAPIR cloud tools use when ground sample distance is unknown.
{% endhint %}

***

## Image types you can view

The layer dropdown at the top-right of the viewer lists every version of the current image. Which entries appear depends on the camera and on what has been processed — see [Image Layers](/chloros/image-viewer-gui/image-layers.md) for the full list and how the dropdown behaves.

### Survey3

* **JPG** — the camera's own preview file
* **RAW (Original)** — the source `.RAW`, debayered for display, no corrections
* **RAW (Target)** — a frame identified as containing a calibration target
* **RAW (Reflectance)** — the calibrated reflectance product (65535 = ρ 1.0)
* **Vignette Corrected** / **Sensor Response** — the uncalibrated fallback product
* **White Balanced** — the white-balanced product
* **RAW (`<INDEX>` Index)** and **`<INDEX>` LUT** — calculated index images

### LATTICE

LATTICE captures use the same dropdown, with the pipeline's level names:

| Layer                 | What it holds                                                        |
| --------------------- | -------------------------------------------------------------------- |
| **RAW (Original)**    | The source raw frame as captured                                     |
| **RAW (Debayered)**   | The linear debayered image                                           |
| **RAW (Preview)**     | The display preview — false-colour stretch for multispectral cameras |
| **White Balanced**    | The display preview for RGB master cameras (white balance + gamma)   |
| **RAW (Radiance)**    | Float32 spectral radiance in W/m²/sr/nm                              |
| **RAW (Reflectance)** | uint16 reflectance, 32768 = ρ 1.0                                    |

Radiance and reflectance are multispectral-only: an RGB master camera has no per-band radiometry, so those layers are not produced for it.

***

## Index and LUT application

Apply multispectral indices and colour Look-Up Tables from the sidebar:

1. Open the **Image Viewer** <img src="https://1328410239-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOlCbgXiWzMtaOKj49kpf%2Fuploads%2Fgit-blob-61f7b64995600417b62eb916ea2c22ddf4c7738f%2Ficon_image-viewer.JPG?alt=media" alt="" data-size="line"> sidebar
2. Tick **Index**
3. Choose your camera's filter and an index formula, then drag the channel circles onto the formula's slots
4. Add a LUT and pick a gradient, thresholds and a clipping mode
5. Read values at the cursor, and save the result with **Export/Save Image(s)**

See [Index/LUT Sandbox](/chloros/image-viewer-gui/index-lut-sandbox.md) for the full walkthrough.

***

## Troubleshooting

### The image will not open

**Possible causes**: the file was moved or deleted after import; the product was never written; not enough memory for a very large image.

**What to do**:

1. Check that the layer's file still exists in the project's output tree
2. Open the file in an external viewer to confirm it is intact
3. Close other applications to free memory

### The image is black, white, or wildly coloured

**Possible causes**: the display stretch has nothing to work with (a nearly-constant frame); a float32 layer with unusual values; an index that produced no valid data.

**What to do**:

1. Read the cursor values — if every channel is at or near zero, the problem is in the data, not the display
2. Check the histogram: a single spike at one end tells you the frame is clipped or empty
3. Check the processing log for the run that produced the layer

### The values look wrong

**Possible causes**: you are on a different layer than you think; you are comparing a percent against a raw DN; you are comparing a LATTICE file against a Survey3 file using the same divisor.

**What to do**:

1. Confirm the selected layer in the dropdown — the panel's units follow the layer
2. For reflectance, use the **%** column rather than dividing the DN yourself; if you must divide, use that file's `Chloros:PixelScale` (32768 for LATTICE, absent means 65535 for Survey3)
3. Set the GSD block size back to 1 — above 1 you are reading a block average, not a pixel
4. Check that reflectance calibration actually ran for that frame; an uncalibrated fallback product (Sensor Response / Vignette Corrected) is not reflectance

***

## Next Steps

* [**Image Layers**](/chloros/image-viewer-gui/image-layers.md) — every layer name, when it exists, and what its values mean
* [**Index/LUT Sandbox**](/chloros/image-viewer-gui/index-lut-sandbox.md) — build, tune and export index visualisations
* [**Map Markers**](/chloros/image-viewer-gui/map-markers.md) — the same image set on a map
* [**Multispectral Index Formulas**](/chloros/project-settings/multispectral-index-formulas.md) — the index reference

For the processing workflow, see [Processing Images (GUI)](/chloros/processing-images-gui/adding-files-to-a-project.md).
