MacAngioView — DICOM cine viewer for macOS Version 0.4.0b · Document date 2026-07-18 · Document version 2.2 (draft)
Disclaimer. MacAngioView is a beta application for evaluation, review, and educational use only. It is not a certified medical device and is not intended for primary diagnosis or clinical decision-making. This document is structured after DICOM PS3.2 but has not been independently audited.
MacAngioView is a standalone macOS desktop application that reads DICOM PS3.10 (Part 10) files and DICOMDIR file-sets from local storage or mounted removable media (CD/DVD/USB), and displays X-ray angiographic (XA) cine runs, multiframe/single-frame ultrasound (US) images, and the Encapsulated PDF and Structured Report (SR) documents contained in a study. It can export loaded runs to QuickTime (.mov) movies and copy the displayed frame to the macOS clipboard (both non-DICOM outputs).
MacAngioView implements Media Interchange services only, in the File-Set Reader (FSR) role. It provides no network services of any kind.
| Service | User of Service (SCU) | Provider of Service (SCP) |
|---|---|---|
| All DIMSE services (Verification, Storage, Query/Retrieve, Print, Storage Commitment, Worklist, MPPS) | No | No |
| DICOMweb (STOW-RS / QIDO-RS / WADO-RS) | No | No |
The application never opens a network association or socket for DICOM purposes; it runs fully offline.
| Media Storage Application Profile | Write Files (FSC/FSU) | Read Files (FSR) |
|---|---|---|
| General Purpose CD-R / DVD (STD-GEN-CD, STD-GEN-DVD-JPEG) | No | Yes |
| Basic Cardiac X-Ray Angiographic (STD-XABC-CD) | No | Yes |
| 1024 X-Ray Angiographic (STD-XA1K-CD, STD-XA1K-DVD) | No | Yes |
| Ultrasound (STD-US-ID/SC/CC-MF…, CD and DVD media) | No | Yes |
MacAngioView never creates or updates a DICOM file-set and never writes DICOM objects.
| Doc version | Date | Application version | Notes |
|---|---|---|---|
| 1.0 (draft) | 2026-07-15 | 0.2.1b | Initial statement |
| 1.1 (draft) | 2026-07-15 | 0.2.2b | Frame VOI LUT functional group, Pixel Aspect Ratio, lossy compression indication |
| 1.2 (draft) | 2026-07-15 | 0.2.2b | Video transfer syntaxes (MPEG2/H.264/HEVC) decoded via bundled ffmpeg |
| 1.3 (draft) | 2026-07-16 | 0.3.0b | Structured Report documents rendered as paginated text |
| 1.4 (draft) | 2026-07-18 | 0.3.0b | Modality LUT Sequence, VOI LUT Sequence, VOI LUT Function (LINEAR_EXACT/SIGMOID) |
| 1.5 (draft) | 2026-07-18 | 0.3.0b | Positioner angles displayed; Person Name ideographic/phonetic groups formatted |
| 1.6 (draft) | 2026-07-18 | 0.3.0b | Frame Time Vector variable timing reproduced in playback |
| 1.7 (draft) | 2026-07-18 | 0.3.0b | Overlay Planes (60xx) and Display Shutter rendered |
| 1.8 (draft) | 2026-07-18 | 0.3.0b | HTJ2K transfer syntaxes decoded (pylibjpeg-openjpeg) |
| 1.9 (draft) | 2026-07-18 | 0.3.0b | XA mask subtraction (DSA, AVG_SUB) with View menu toggle |
| 2.0 (draft) | 2026-07-18 | 0.3.0b | User-designated DSA mask frame (application feature) |
| 2.1 (draft) | 2026-07-18 | 0.3.0b | Mask Sub-pixel Shift applied; user mask re-registration (nudge) |
| 2.2 (draft) | 2026-07-18 | 0.4.0b | Release 0.4.0b — revisions 1.4–2.1 ship in this application version |
This document is intended for people integrating or evaluating MacAngioView alongside other DICOM applications (modalities, media creators, PACS export functions). It assumes familiarity with the DICOM standard (PS3.1–PS3.20).
Conformance to this statement does not guarantee interoperability; validation with representative media from the intended source systems is recommended.
FSR — File-Set Reader. TS — Transfer Syntax. SOP — Service-Object Pair. VOI — Value of Interest. XA — X-Ray Angiography. US — Ultrasound.
| Application name | MacAngioView |
| Version | 0.4.0b |
| Platform | macOS 12+ (Intel and Apple Silicon via Rosetta 2) |
| DICOM toolkit | pydicom 3.0.2 with python-gdcm 3.2.6, pylibjpeg 2.1 (openjpeg plugin), and Pillow pixel-data decoders |
Not applicable. MacAngioView implements no DICOM network application entities, initiates no associations, and accepts none.
One local Application Entity, MEDIA-FSR, is activated by the user through the GUI (File ▸ Open File…/Open Folder…, or the equivalent buttons). It reads a file-set or individual files, builds an index of the image and document instances found (metadata only), and then decodes the pixel data of a run on demand when the user selects it. Decoded frames are held in memory only; nothing is written back to the media, which can be ejected from within the application.
-
RWA 1 — Load a file-set: the user selects a disc/folder. The
application locates a
DICOMDIRat the selected location or one subfolder level below it (case-insensitive name match) and enumerates every existing file referenced by Referenced File ID (0004,1500). Directory-record hierarchy attributes are not otherwise interpreted. -
RWA 2 — Load individual files: the user selects a single Part 10
file, or a folder containing
*.dcmfiles (searched recursively) without a DICOMDIR. - RWA 3 — Review: indexed instances appear as thumbnails; the selected instance is displayed with cine playback, frame stepping, window/level, zoom, and edge-enhancement controls. Encapsulated PDF instances are rendered as pageable images (or opened in an external PDF viewer), and Structured Report instances as pageable text renderings of their content tree.
MacAngioView is a general-purpose FSR: it does not verify that a file-set declares or conforms to a specific application profile. Any file-set whose instances use the SOP classes and transfer syntaxes listed below can be read; this covers the STD-GEN, STD-XABC, STD-XA1K, and STD-US family profiles listed in Table 1-2.
Instance selection is content-based, not SOP-Class-restricted: any instance whose pixel data can be decoded is displayed. The SOP classes below are the design targets and the ones exercised in testing.
| SOP Class | UID | Support |
|---|---|---|
| X-Ray Angiographic Image Storage | 1.2.840.10008.5.1.4.1.1.12.1 | Display, cine |
| Enhanced XA Image Storage | 1.2.840.10008.5.1.4.1.1.12.1.1 | Display, cine (frame timing from per-frame Frame Content macros) |
| Ultrasound Image Storage | 1.2.840.10008.5.1.4.1.1.6.1 | Display (single frame) |
| Ultrasound Multi-frame Image Storage | 1.2.840.10008.5.1.4.1.1.3.1 | Display, cine |
| Encapsulated PDF Storage | 1.2.840.10008.5.1.4.1.1.104.1 | Rendered per page (also detected by an application/pdf Encapsulated Document when the SOP Class UID is absent) |
| SR Document Storage family (Basic Text, Enhanced, Comprehensive, …) | 1.2.840.10008.5.1.4.1.1.88.* | Content tree rendered as read-only paginated text (also detected by Modality SR with a Content Sequence when the SOP Class UID is absent). TEXT/CODE/NUM/PNAME/DATE-TIME/UIDREF items shown; IMAGE/COMPOSITE/WAVEFORM references listed by SOP Instance UID, not resolved |
| Secondary Capture and other image SOP classes | various | Best-effort display when pixel data is decodable |
| Media Storage Directory Storage (DICOMDIR) | 1.2.840.10008.1.3.10 | Read (Referenced File ID resolution only) |
Presentation states (GSPS), key object selections, waveforms, and the dedicated video SOP classes are not interpreted as such — but any image instance whose transfer syntax is a video codec (including US Multi-frame studies exported as MPEG-4) is decoded and played per 4.5. Structured Report documents are rendered as read-only paginated text of their content tree; coded entries are shown by their Code Meaning (coding scheme designators and values are not displayed), and templates are not validated.
Decoding is provided by pydicom with the python-gdcm and Pillow backends; the video transfer syntaxes are decoded by the bundled ffmpeg (imageio-ffmpeg). All decoders ship in the distributed application.
| Transfer Syntax | UID | Read |
|---|---|---|
| Implicit VR Little Endian | 1.2.840.10008.1.2 | Yes |
| Explicit VR Little Endian | 1.2.840.10008.1.2.1 | Yes |
| Deflated Explicit VR Little Endian | 1.2.840.10008.1.2.1.99 | Yes |
| Explicit VR Big Endian (retired) | 1.2.840.10008.1.2.2 | Yes |
| RLE Lossless | 1.2.840.10008.1.2.5 | Yes |
| JPEG Baseline (Process 1) | 1.2.840.10008.1.2.4.50 | Yes |
| JPEG Extended (Process 2 & 4) | 1.2.840.10008.1.2.4.51 | Yes |
| JPEG Lossless (Process 14) | 1.2.840.10008.1.2.4.57 | Yes |
| JPEG Lossless SV1 (Process 14, FOP=1) | 1.2.840.10008.1.2.4.70 | Yes |
| JPEG-LS Lossless / Near-Lossless | 1.2.840.10008.1.2.4.80 / .81 | Yes |
| JPEG 2000 Lossless / Lossy | 1.2.840.10008.1.2.4.90 / .91 | Yes |
| MPEG2, MPEG-4 AVC/H.264 (all profiles) | 1.2.840.10008.1.2.4.100–.106 | Yes — bundled ffmpeg |
| HEVC/H.265 | 1.2.840.10008.1.2.4.107 / .108 | Yes — bundled ffmpeg |
| High-Throughput JPEG 2000 (HTJ2K) | 1.2.840.10008.1.2.4.201–.203 | Yes — pylibjpeg-openjpeg |
Video-transfer-syntax runs are decoded whole into memory as RGB frames (the encapsulated bitstream is reconstructed across fragments), capped at 1000 frames per run; window/level does not apply to them. When the data set carries no frame-rate attribute, the rate reported by the video stream itself is used. An instance in an unsupported transfer syntax is indexed but its thumbnail shows Error and the failure is logged to the in-app Console; it does not block the rest of the study.
- Photometric Interpretation: MONOCHROME1 (rendered inverted), MONOCHROME2, PALETTE COLOR (color LUT applied), RGB, and the YBR variants produced by the JPEG codecs (converted to RGB by the decoder).
- Modality LUT: a Modality LUT Sequence (0028,3000) is applied to grayscale data when present; otherwise the linear Rescale Slope (0028,1053) / Intercept (0028,1052).
- VOI: grayscale images are windowed with the VOI LUT Function (0028,1056) the data set declares — LINEAR, LINEAR_EXACT, or SIGMOID (PS3.3 C.11.2). The default window is resolved from, in order: the first value pair of the top-level Window Center (0028,1050) / Window Width (0028,1051); the Frame VOI LUT functional-group macro (0028,9132) — shared group first, then the first per-frame item (per-frame varying windows are not reproduced); the input range of the first VOI LUT Sequence (0028,3010) item; the full data range. When a VOI LUT Sequence is present its first LUT is rendered as the default view (output normalized over the table's value range); adjusting window/level interactively replaces the table with a window, and Reset returns to the table.
- Pixel geometry: non-square pixels are displayed square. The vertical:horizontal ratio is taken from Pixel Aspect Ratio (0028,0034), or from the row:column ratio of Pixel Spacing (0028,0030) / Imager Pixel Spacing (0018,1164) / the Enhanced shared Pixel Measures group; the lower-resolution axis is upscaled (never downsampled). Only the ratio is used — spacing values are not used for calibrated measurements.
- Lossy compression indication: the Lossy Image Compression state (0028,2110), with method (0028,2114) and ratio (0028,2112) when present, is shown in the Patient panel for the selected instance.
- Cine timing: the playback rate is resolved from, in order: XA Acquisition Frame Rate → Cine Rate → Recommended Display Frame Rate → Frame Time → mean of Frame Time Vector → Actual Frame Duration → for Enhanced multiframe objects, the median inter-frame interval of the per-frame Frame Acquisition/Reference DateTime values. A Frame Time Vector's per-frame variable timing is reproduced during playback: each frame's dwell is its vector entry, scaled proportionally when the user adjusts the rate (whose readout stays the mean rate). Non-positive entries fall back to the mean interval. QuickTime export renders at a single uniform rate.
- Overlay Planes: the 60xx Overlay Plane groups (Overlay Data bitmaps) are composited in white onto monochrome images after the VOI stage. A single-frame overlay applies to every frame of a multi-frame image; a multi-frame overlay maps through Image Frame Origin; Overlay Origin places the plane (clipped at the image edges). Overlays embedded in unused Pixel Data bits (retired in DICOM 2004) are not extracted, and overlays are not composited onto color images.
- Display Shutter: RECTANGULAR, CIRCULAR, and POLYGONAL shutter shapes (PS3.3 C.7.6.11) are combined and the area outside them is painted with the Shutter Presentation Value (high byte; black when absent) on monochrome images. The Enhanced multi-frame Frame Display Shutter macro is not applied.
- Positioner angles: Positioner Primary/Secondary Angle (0018,1510/ 0018,1511) — top-level or the Enhanced XA/XRF Positioner macro (0018,9405) — are shown in the Patient panel in the LAO/RAO · CRA/CAU convention (PS3.3 C.8.7.5). A rotational acquisition's per-frame varying angles are not tracked; the first value stands for the run.
- Mask subtraction (DSA): a Mask Subtraction Sequence (0028,6100) item with Mask Operation AVG_SUB enables the View ▸ Subtracted (DSA) toggle: the mask is the mean of the Mask Frame Numbers, subtraction is limited to the Applicable Frame Range (other frames show native), and a run whose Recommended Viewing Mode (0028,1090) is SUB starts subtracted. While subtracted, the window defaults span the subtracted signal; QuickTime export and Copy follow the on-screen state. Mask Sub-pixel Shift (0028,6114) is applied as the mask's initial registration shift (bilinear, edge-replicated), and the user can re-register the mask against patient motion in 1 px steps (⌥-arrows, View ▸ Nudge DSA Mask) or 0.1 px steps (⇧⌥-arrows). Mask Operation TID is not applied. As an application feature beyond the data set, the user may designate the currently displayed frame as the mask (View menu), which enables subtraction for multi-frame grayscale cines carrying no Mask Subtraction Sequence and supersedes a file-provided spec until removed.
- Not applied / not displayed: calibrated measurements (pixel spacing is used for the aspect ratio only), Ultrasound Regions, and Grayscale Softcopy Presentation States.
- Rendering: frames are rendered to 8-bit for display, fit to a 512×512 or 1024×1024 viewport (aspect preserved, never magnified past 1:1 in 1024 mode). No PS3.14 (GSDF) display calibration is performed.
- Files lacking File Meta Information (raw data sets) are accepted: the transfer syntax is inferred from the detected byte order / VR encoding and the data set is read best-effort.
-
DICOMDIRlocated one directory level below the selected folder is accepted (some media place the file-set in a subfolder). - Encapsulated PDF documents are rendered in-app via PyMuPDF.
- Loaded runs can be exported to QuickTime (.mov, H.264) via the bundled ffmpeg; the displayed frame can be copied to the clipboard. These outputs are not DICOM objects and carry no DICOM header; any burned-in identification in the pixel data is preserved as-is.
Data-set text is decoded by pydicom according to Specific Character Set
(0008,0005), including ISO-IR 100 (Latin-1) and the other single-byte and
multi-byte character sets pydicom supports; decoded text is displayed as
Unicode. Person Name values are displayed with component delimiters (^)
replaced by spaces (empty components dropped); the ideographic and
phonetic component groups (= delimited, PS3.5 6.2.1) follow the first
group in parentheses, e.g. "Yamada Tarou (山田 太郎, やまだ たろう)".
- The application runs entirely offline; no data leaves the machine except by explicit user action (QuickTime export, clipboard copy).
- Media are read-only to the application; Eject unmounts the volume and purges all decoded frames and demographics from memory.
- Decoded pixel data is held in memory only; no image cache is written to disk. Two transient exceptions: an Encapsulated PDF opened externally is written as a temporary PDF file for the system viewer, and a video-transfer-syntax bitstream is written to a temporary file for the ffmpeg decoder and deleted as soon as decoding ends.
- The application is Developer ID signed and Apple-notarized. The beta build stops launching 90 days after first launch.
- No de-identification is performed on export/copy outputs.
Attributes read for indexing and display include: SOP Class UID, Transfer Syntax UID, Modality, Number of Frames, Rows/Columns, Bits Allocated/Stored, Photometric Interpretation, Pixel Data, the frame-rate attributes listed in 4.6, Window Center/Width, the Frame VOI LUT functional-group macro, Modality LUT Sequence, Rescale Slope/Intercept, VOI LUT Sequence, VOI LUT Function, Pixel Aspect Ratio, Pixel Spacing / Imager Pixel Spacing / Pixel Measures (ratio only), Lossy Image Compression / Method / Ratio, Palette Color LUT attributes, Positioner Primary/Secondary Angle (and the Positioner Position macro), the 60xx Overlay Plane attributes, the Display Shutter attributes, the Mask Subtraction Sequence and Recommended Viewing Mode, Patient Name, Patient ID, Patient Birth Date, Study Date, Study Time, Encapsulated Document, MIME Type of Encapsulated Document, and (DICOMDIR) Referenced File ID.
Grayscale frames are mapped with the DICOM VOI equations (PS3.3 C.11.2.1.2 LINEAR; C.11.2.1.3 LINEAR_EXACT and SIGMOID) over the effective window, or through the data set's VOI LUT table at the default window, then quantized to 8 bits; MONOCHROME1 output polarity is inverted after the VOI stage.