SharpAstro → Guides → Astro Photo Viewer
User guide
Astro Photo Viewer
A viewer for the frames a night actually produced: FITS, planetary SER video, TIFF and Canon RAW. It stretches and demosaics on the GPU, measures the stars it finds, plate-solves a frame and draws a catalogue over it, and compares two processing states side by side. This page covers everything the shipping version does.
Installing
On Windows, install it from the Microsoft Store. It updates itself from there, and the Store build registers the file associations for you — you still have to pick it as the default application for a file type in Windows Settings, which is Windows' choice to make, not the app's.
Windows 10 version 2004 or newer, x64 and ARM64. Linux and macOS run the
same viewer from a self-contained archive on
GitHub Releases —
no runtime to install, and no installer either: unpack it and run
tianwen-fits. An unpackaged install can register its own file
associations with tianwen-fits --register.
Opening images
Drag a file onto the window, use the folder button at the top left, or pass a path on the command line. The formats are:
| Format | Notes |
|---|---|
.fits .fit .fts .fz |
Including tile-compressed .fz, and multi-extension files where the image is not the first block. |
.tif .tiff |
8-, 16-bit and 32-bit float, including CMYK and Deflate/LZW compression. |
.cr2 .cr3 |
Canon RAW, decoded to its native sensor data rather than the embedded JPEG. |
.ser |
Planetary video. Opens in playback mode — see Planetary video. |
Opening one file opens its folder. Every supported image beside it appears in the file list on the left, so stepping through a night's subs is ↑ and ↓ rather than a sequence of file dialogs. Drag the divider to resize the list, or press L to hide it.
Double-clicking a second file from the same folder hands it to the window
already showing that folder instead of starting another copy of the
app. Each folder gets one window. To deliberately open a second window on the
same folder — two views of one directory, side by side — start it
with --new-window.
Getting around
Drag the image to pan and use the wheel to zoom. F fits the image to the window, R goes to 1:1, and Z opens a menu with the fixed ratios (Ctrl+2 to Ctrl+9 are 1:2 through 1:9). The zoom button in the toolbar is also the read-out: it shows the current scale, so there is no second copy of that number anywhere else.
Three panels toggle independently: L the file list, I the info panel on the right (metadata, per-channel statistics and the cursor read-out), and V the histogram, with Shift+V switching it to a log scale. The white balance has its own panel under W rather than standing open in the info panel. F11 is fullscreen, and Esc closes whatever is open — a panel, then a selection — before it quits.
Making the image visible
A linear astronomical frame is nearly black: almost all of its data sits in the bottom fraction of a percent of the range. A screen stretch is a display curve that makes that visible without altering a single stored pixel. Everything in this section changes only what you are looking at.
T turns the stretch on and off — the fastest way to see what the data actually looks like. The mode button beside it picks how the three channels are treated:
| Mode | What it does |
|---|---|
| Auto | Linked when a colour calibration is applied, unlinked otherwise. The default, and usually right. |
| Linked | One curve for all three channels, so an existing colour balance survives as colour. |
| Unlinked | Each channel gets its own curve, which neutralises the background. Good for judging structure, and it will discard a real colour cast along with an unwanted one. |
| Luma | Stretches luminance and blends the colour back, so saturation does not climb with the curve. |
+ and − step through stretch strength presets. B cycles a curves boost and Shift+B changes which curve it applies; H cycles HDR highlight compression, which pulls back a blown core without flattening the rest. C cycles the channel view between RGB and a single channel, and D cycles the demosaic algorithm for a Bayer sensor — the small swatch on that button is the sensor's actual CFA phase, read from the file. The demosaic starts on Auto, which reads the answer off the file rather than asking you for it: a still colour frame is demosaiced with VNG, which leaves no dark ring around a bright star, and a SER video with MHC, so a frame you are scrubbing looks like the master the planetary stacker will build from it. A mono or already-colour frame is left alone.
Shift+C crops a stacked master to the area every frame actually covered, taking off the ragged, under-exposed border a stack leaves where only some of the subs reached. Where the stack wrote a coverage map the answer is exact; otherwise the edge is measured. The crop is not just a view: the plate solution, a saved file, the A/B comparison and the AI enhancement all see the cropped frame, which matters most for the enhancement, since the border is exact zero and a neural network reads that as structure. Press it again to see the whole frame.
Colour
W opens the white balance panel, which holds everything colour in one place: three sliders, an Auto grey-world guess, a Reset, and the colour calibration itself. The sliders show the effective balance — the calibration composed with your own fine-tune, which is exactly what the screen is being multiplied by — so the panel never reads neutral over an image that visibly is not.
With a calibration in force the panel also prints what it measured: the method it used, how many samples or stars survived, and the white reference where there is one. That line is the point — a triple like "R = 0.46" could have come from a careful fit or a crude guess, and only the provenance tells you which.
N neutralises the background, and it is a separate step on purpose: a white balance is one multiplier per channel, which can only cancel a per-channel offset at a single brightness, so a sky with a gradient or a pedestal keeps its cast until this is applied on top. Turning the calibration off restores the balance you had before it ran.
Photometric calibration is broadband only. A narrowband stack has no colour path: the calibration needs stellar colours to match against, and a 3 nm passband does not carry them. Narrowband images still stretch, measure and solve normally.
Stars, solving and the sky
S detects stars and draws them, and the status bar reports the count with the average HFD and FWHM — the two numbers that say whether a sub is worth keeping. It measures the frame as loaded, so it is a judgement about that exposure rather than about the stack.
P plate-solves the frame. A solve is what turns pixel coordinates into sky coordinates, and it unlocks everything below. The built-in solver needs no external program and no internet; if you have ASTAP or Astrometry.net installed it will use those as fallbacks.
O then steps through three levels of context rather than toggling one: first a WCS coordinate grid, then the deep-sky objects the frame contains, then the sky itself drawn behind your photograph — the same star field, constellation figures and catalogue the browser sky atlas shows, aligned to your plate solve and sitting exactly where your frame sits on the sky. Shift+O steps back down, and G still toggles the grid on its own. At the top level a small floating panel appears over the image with the map's ten layers on it; drag it to any edge, or double-click its grip to roll it up.
Click any catalogued object to see what it is. A panel appears with its name, type and magnitude, and — where the frame records when and where it was taken — its altitude and rise, transit and set times at the moment of the exposure, not at the moment you happen to be looking. The ring drawn round the selection traces the object's own shape where the catalogue knows one, so an inclined galaxy rings as the tilted disc it is rather than as a circle. Esc clears the selection.
With the pointer over the image, the info panel's cursor block shows the pixel position, its per-channel value in both normalised and 16-bit form, and — once solved — the RA and Dec under the cursor. Right-click copies any of it: the menu carries the coordinates in both sexagesimal and decimal degrees, the pixel value, the position, and a link that opens the in-browser sky atlas looking at exactly that part of the sky, at the frame's own field of view and at the moment the frame was taken. Every entry shows its value in the menu, so you can read the answer without copying anything.
Comparing frames
A/B split — one frame, two processing states
A puts a divider down the middle of the image. The right half follows your controls; the left half is pinned to how things looked when you pressed it. Drag the divider to sweep the comparison across the frame. Each half is labelled with what makes it different from the other, so you are never guessing which side is which. Shift+A re-pins the left half to the current settings — the "pin what I have, then fiddle" gesture. After an AI enhancement the split switches to comparing pixels, before against after, because that is what you want to see at that moment.
Blink — two frames, one processing state
Comparing subs by stepping between them normally fails for a reason that is not obvious: each frame gets its own auto-stretch, so a genuine brightness difference is hidden by the display adapting to it. The viewer therefore holds the display mapping across frames of the same shape by default — the second frame is shown with the first frame's stretch, so what you see differing is the data.
The status bar says Held to <file> whenever that is happening, and
Shift+H releases or re-takes the hold.
Ctrl+Space jumps back to the held frame.
Space blinks forward through the file list and
Shift+Space backward; pressing the same direction again pauses,
pressing the other one reverses. A frame the held mapping cannot describe — a
different size, sensor or filter — stops the blink and says which file it was.
Planetary video
Opening a .ser switches the viewer into playback. Space plays
and pauses, ← and → step one frame,
Home and End jump to the first and last, and the scrub bar
under the image seeks.
K switches between the raw frame and a rolling lucky-imaging stack that follows the playhead: it grades frames by sharpness, keeps the best, aligns and integrates them, and updates as you scrub. Six wavelet-sharpen sliders in the info panel work over the result. All of it runs off the render thread, so the sliders stay responsive however long a stack takes.
AI enhancement
E runs an AI enhancement — star removal, deconvolution, denoising or gradient correction, depending on what is available. Right-clicking the button cycles which backend is used. Pressing E again turns the result off, and while one is running it cancels.
The viewer ships with its own denoising model for one-shot-colour images, so that one works out of the box. The rest are other people's models, and the viewer reads them wherever their own installers put them — nothing is copied and no files are duplicated. If you have RC-Astro's tools or SETI Astro's SAS Pro installed, they are found automatically; if not, those roles are simply unavailable. The ? panel lists which backend resolved, which products are licensed, and which model files are missing.
Saving what you see
The save button offers three things. Image as displayed (16-bit)
and Image as displayed (8-bit) write the picture with the stretch,
white balance, curves, HDR and channel view baked in, and nothing else. The choice
between them is the depth of a PNG, and it binds on a .png name alone:
a JPEG is 8-bit because baseline JPEG is, and a TIFF here is always 32-bit float,
so typing either of those extensions still writes what the name asked for.
Image with overlays writes the same picture with the coordinate
grid, star markers and object labels drawn on it, as a PNG or a JPEG.
Neither is a screenshot. The pixels are re-rendered at the image's own resolution, so a 9576×6388 master saves at 9576×6388 from a 1280-pixel-wide window — and the annotation is drawn at that size too, rather than scaled up from the screen. Whichever overlays are switched on when you save are the ones you get; turn a grid off first and it will not be in the file.
The annotated file is suggested as <name>-annotated.png, because
the two saves are of one picture and land in the same folder. Right-clicking the save
button skips the menu and writes the clean version straight away.
The annotated save is 8 bits per channel. The clean one can be 16-bit PNG or float TIFF, so that is the one to keep if you are going on to edit it — the annotated file is for showing someone what is in the frame.
16-bit is the default for the clean save, and the reason inverts the intuition. On a single sub the noise straddles several 8-bit steps and dithers them, so nothing bands. On a deep stack or a denoised master the noise floor drops below one step, and a smooth gradient turns into visible contours. 8 bits is safest on the worst data and most dangerous on the best, which is why it is a choice per save rather than a setting.
Every keyboard shortcut
The same list is in the app, behind the ? button at the top right, along with the version you are running.
View
| Wheel / Ctrl+Wheel | Zoom |
| Ctrl + / Ctrl − | Zoom in / out |
| F / Ctrl+0 | Fit to window |
| R / Ctrl+1 | Zoom 1:1 |
| Ctrl+2 … Ctrl+9 | Zoom 1:N |
| Z | Zoom menu (fit / 1:1 / 1:N) |
| L | File list |
| I | Info panel |
| V / Shift+V | Histogram / log scale |
| F11 | Fullscreen |
| Esc | Clear the selection, else quit |
Display
| T | Screen stretch on / off |
| + / − | Stretch strength preset |
| B / Shift+B | Curves boost / curve mode |
| H | HDR highlight compression |
| C | Channel view (RGB or one channel) |
| D | Demosaic algorithm |
| W | White balance panel: sliders, colour calibration, reset |
| N | Neutralise the background |
| Shift+C | Crop to the area every sub covered / show all |
Measuring
| S | Detect stars, show HFD / FWHM |
| P | Plate solve this frame |
| G | WCS coordinate grid |
| O / Shift+O | Context: grid, then catalogue objects, then the sky behind the frame |
| E | AI enhance (right-click the button to change backend) |
| Click | Select the catalogued object under the pointer |
| Right-click | Copy RA/Dec, pixel value, position, or a sky-atlas link |
Comparing
| A / Shift+A | Before / after split; re-pin |
| Shift+H | Hold / release the display across frames |
| Space | Blink the file list forward (play / pause for a sequence) |
| Shift+Space | Blink backward |
| Ctrl+Space | Back to the frame the display is held to |
| ↑ / ↓ | Previous / next file |
Sequences (SER)
| Space | Play / pause |
| ← / → | Step one frame |
| Home / End | First / last frame |
| K | Raw / stacked view |
When something looks wrong
The ? button at the top right is the first place to look. It reports the exact version and build, where the app is installed, and the state of every AI backend — which one resolved, what is licensed, and which model files are missing. "The viewer from the Store" is not enough detail for a bug report; that panel is.
Logs are written per run to
%LOCALAPPDATA%\TianWen\Logs\<date>\FitsViewer_*.log on Windows, and
to ~/.local/share/TianWen/Logs/ on Linux.
Photometric colour calibration is broadband only. On a mosaic frame the single-channel views show the raw mosaic rather than the separated colour planes.
Bugs and feature requests go to the issue tracker. The viewer is part of tianwen, which is open source under the AGPL.