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. To make it the default application for a file type, pick it in Windows Settings.
Windows 10 version 2004 or newer, x64 and ARM64. Builds for Linux, macOS
and Windows without the Store are on
GitHub Releases.
On macOS, open the .dmg. On Linux or Windows, unpack the
self-contained archive and run tianwen-fits; there is no runtime to
install.
The archive builds do not register file types on their own. Run
tianwen-fits --register once for the FITS types and
tianwen-fits --register SER for SER. The Store build does not need
this. On macOS, set the default app in Finder with Get Info → Open With.
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 open a second window on the same folder,
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 shows the current scale.
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 H the histogram, with Shift+H switching it to a log scale. The white balance has its own panel under W. F11 is fullscreen. Esc closes an open menu or popover first, then an enlarged object picture, then clears the selection, and only then 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 data visible without changing the stored pixels. Everything in this section changes only what is displayed.
T turns the stretch on and off, which is the quickest way to see the unstretched data. The mode button beside it picks how the three channels are treated:
| Mode | What it does |
|---|---|
| Auto | Linked when a colour calibration is applied or the channels already agree, unlinked otherwise (and for narrowband colour). 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. |
| Planetary | For a planet or the Moon: keeps the dark sky dark instead of lifting it, so the disc is not blown out. A frame whose OBJECT names a planet or the Moon opens in this mode. |
+ and − step through stretch strength presets. The Tone button holds the curves boost and the HDR highlight compression, which pulls back a blown core without flattening the rest; scroll over the button to step the compression. B cycles the boost and Shift+B changes which curve it applies. C cycles the channel view between RGB and a single channel (colour frames only), and D cycles the demosaic algorithm for a Bayer sensor. The small swatch on that button is the sensor's CFA phase, read from the file. The demosaic starts on Auto, which picks the algorithm from the file: 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 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 plate solution, saved files, the A/B comparison and the AI enhancement all use the cropped frame. This matters most for the enhancement: the border is exactly zero, and a neural network treats 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, meaning the calibration combined with your own adjustment, so they always match what is on screen.
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. A value like "R = 0.46" could come from a careful fit or a rough guess, and this line tells you which.
N neutralises the background. It is a separate step because 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 tell you whether a sub is worth keeping. It measures the frame as loaded.
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 annotates the frame: a WCS coordinate grid and the deep-sky objects the frame contains. Press it again to hide them. Shift+O steps the two levels one at a time if you want the grid without the objects, and G toggles the grid on its own.
Y puts the sky behind your photograph: the same star field, constellation figures and catalogue the browser sky atlas shows, aligned to your plate solve. It needs a solved frame, and the toolbar button says so when there is not one yet. With the sky up, 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 shows its name, type and magnitude. If the frame records when and where it was taken, the panel also shows the object's altitude and its rise, transit and set times at the time of the exposure. Where available, the panel has a picture of the object (click to enlarge) and links to its Wikipedia article and the sky atlas. The ring drawn round the selection follows the object's shape where the catalogue has one, so an inclined galaxy gets an ellipse instead of 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 the frame is solved, the RA and Dec under the cursor. Right-click to copy 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. Shift+A re-pins the left half to the current settings. After an AI enhancement, the split compares the image before and after the enhancement.
Blink — two frames, one processing state
Each frame you click or step to gets its own auto-stretch, as it does in N.I.N.A. and PixInsight. That makes subs hard to compare: with a fresh stretch per frame, the display adapts to a real brightness difference and hides it. Ctrl+H holds the display mapping across frames of the same shape, so every frame is shown with the held frame's stretch and any difference you see is in the data. Blinking uses the same per-frame stretch as clicking, so turn on the hold first if you want to compare. The colour calibration is shared across the run either way, so clicking to another frame never runs a second SPCC fit.
The status bar says Held to <file> whenever that is happening, the
held frame carries an [H] in the file list, and
Ctrl+H releases or re-takes the hold. While held, a sub whose sky is darker
than the held frame's is shown darker all over, target included, so release the hold
when you are looking at a single frame.
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 apply to (a
different size, sensor or filter) stops the blink, and the status bar names the file.
Planetary video
Opening a .ser switches the viewer into playback. Space or
Tab plays and pauses, ← and → step one
frame, Home and End jump to the first and last,
↑ and ↓ change the playback speed, and the scrub bar
under the image seeks.
The view has three modes: Frames, Live and Auto. K switches between the frames and the Live view, 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. Shift+K builds the Auto view: the whole capture is stacked once and the result is saved beside the SER. Press it again while it runs to cancel.
Six wavelet-sharpen sliders in the info panel work over the result, with Derive to set them from the planet and telescope and Reset to clear them. Stacking 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 the backend between Auto, RC-Astro and TianWen's own. 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 from wherever their own installers put them, without copying anything. If you have RC-Astro's tools installed, they are found automatically; if not, those enhancements are 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 8/16-bit choice only applies to PNG: a JPEG is always 8-bit and a TIFF is always 32-bit float, whichever entry you picked. 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.
None of these is a screenshot. The image is re-rendered at its own resolution, so a 9576×6388 master saves at 9576×6388 from a 1280-pixel-wide window, and the annotations are drawn at that size too. The file includes whichever overlays are switched on when you save.
The annotated file is suggested as <name>-annotated.png, so it can
sit in the same folder as the clean save. 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 keep that one if you are going to edit it further. The annotated file is for showing someone what is in the frame.
16-bit is the default for the clean save. On a single sub the noise spans several 8-bit steps and dithers them, so nothing bands. On a deep stack or a denoised master the noise drops below one step, and a smooth gradient turns into visible contours. So 8-bit is fine for a noisy sub but can band on a clean master.
Every keyboard shortcut
The same list is in the app, behind the ? button at the top right (F1), along with the version you are running.
View
| Ctrl+O | Open a file |
| Ctrl+S | Save the image as displayed (clean, 16-bit PNG) |
| Ctrl+Shift+S | Save menu: with overlays, PNG depth |
| 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 |
| H / Shift+H | Histogram / log scale |
| F1 | Shortcuts, version and diagnostics panel |
| F11 | Fullscreen |
| Esc | Close a menu, else clear the selection, else quit |
Display
| T | Screen stretch on / off |
| + / − | Stretch strength preset |
| B / Shift+B | Curves boost / curve mode (HDR compression is on the Tone button) |
| 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 | Annotate: grid + catalogue objects (Shift+O for the grid alone) |
| Y | The sky behind the frame (needs a plate solve) |
| 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 |
| Ctrl+H | Hold / release the display across frames |
| Space | Blink the file list forward (hold to pause) |
| Shift+Space | Blink backward |
| Ctrl+Space | Back to the frame the display is held to |
| ↑ / ↓ | Previous / next file (stills) |
Sequences (SER)
| Space / Tab | Play / pause |
| ← / → | Step one frame |
| Home / End | First / last frame |
| ↑ / ↓ | Faster / slower playback |
| K | Frames / Live stack |
| Shift+K | Auto view: stack the whole capture and save it (again to cancel) |
When something looks wrong
The ? button at the top right (F1) 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. Include what it shows when you report a bug.
Logs are written per run to
%LOCALAPPDATA%\TianWen\Logs\<yyyyMMdd>\FitsViewer_*.log on Windows,
~/Library/Application Support/TianWen/Logs/ on macOS, and
~/.local/share/TianWen/Logs/ on Linux (or under
$XDG_DATA_HOME/TianWen if that is set).
Photometric colour calibration is broadband only. The single-channel view is not available on a raw mosaic (Bayer) frame.
Bugs and feature requests go to the issue tracker. The viewer is part of tianwen, which is open source under the AGPL.