TmapSlide
Pure Python reader for UNIC TMAP whole-slide images — no SDK, no native deps.
以纯 Python 读取联影 TMAP 全切片图像,开箱即用
⚡ Quick Start
1. Install:
pip install tmapslide
2. Read a slide:
import tmapslide
slide = tmapslide.OpenSlide("sample.TMAP")
print(slide.dimensions) # (71424, 72704)
print(slide.level_count) # 10
print(slide.level_downsamples) # (1.0, 2.0, 4.0, ...)
region = slide.read_region((512, 512), 0, (1024, 1024)) # RGBA PIL image
thumb = slide.get_thumbnail((512, 512))
macro = slide.associated_images["macro"]
✨ Features
- Pure Python — no vendor SDK, no native dependencies; only Pillow
- OpenSlide-compatible API — drop-in for code written against
openslide/kfbslide:read_region,get_thumbnail,dimensions,level_count,level_dimensions,level_downsamples,properties,associated_images - Both known TMAP variants —
TMAP06(3-level pyramid) andTMAP07(up to 10 levels) - Multi-file slides — TMAP06 slides that spill tiles into
.DT1sidecar files are read transparently - Trusted pixel size — several TMAP06 and TMAP07 headers carry an
impossible
pixel_size(e.g. 6.88e-05 mm at 40x, implying ~2 µm nuclei); tmapslide cross-checks it against the objective power and falls back to 10 µm / magnification, exposing the result viaopenslide.mpp-x/openslide.mpp-y(the raw header value stays intmap.pixel_size_mm, the decision intmap.mpp_source) - Fork-safe file handles — safe with PyTorch
DataLoaderworkers - LRU decoded-tile cache — fast repeated reads
- Thread-safe reads — concurrent
read_regionfrom worker threads
🏎️ Performance
Benchmark vs ASlide's pure-Python TMAP backend (median of 5 runs, same files, same machine):
| Scenario | TMAP07 | TMAP06 |
|---|---|---|
| Open slide | 281 ms vs 43 ms ⚠️ | 101 ms vs 224 ms (2.2×) |
| Cold 1024² region @L0 | 4.1 ms vs 15.7 ms (3.8×) | 2.6 ms vs 14.8 ms (5.6×) |
| Random 512² region @L0 | 1.1 ms vs 5.7 ms (5.3×) | 0.9 ms vs 6.3 ms (6.7×) |
| Warm 512² region ×50 | 42 ms vs 217 ms (5.1×) | 54 ms vs 408 ms (7.6×) |
ASlide's TMAP backend re-decodes every tile on every call; tmapslide adds an LRU decoded-tile cache and per-tile culling, so warm reads and random access are several times faster.
📖 API
tmapslide.OpenSlide(filename)
| Member | Description |
|---|---|
dimensions |
(width, height) at level 0 |
level_count |
number of pyramid levels |
level_dimensions |
(w, h) per level |
level_downsamples |
downsample factor per level |
properties |
read-only metadata mapping (openslide.vendor=unic, openslide.mpp-x/y, tmap.*) |
associated_images |
lazy mapping, typically macro / label / thumbnail |
read_region(loc, level, size) |
PIL.Image (RGBA) of the region |
get_thumbnail(size) |
stored thumbnail when available, else lowest level |
get_best_level_for_downsample(ds) |
best level for a downsample factor |
iter_tiles(level=0) |
yields (x, y, load) per stored tile |
close() / context manager |
release resources |
tmapslide.open_slide(filename)
Alias of OpenSlide(filename).
📦 Supported Formats
| Format | Extension | Vendor | Backend |
|---|---|---|---|
| TMAP 06 | .TMAP (+ optional .DT1 sidecars) |
UNIC (United Imaging) | Pure Python |
| TMAP 07 | .TMAP |
UNIC (United Imaging) | Pure Python |
🧪 Testing
Tests run against real TMAP samples when the scce_external_center data
directory (or TAPSLIDE_TEST_DATA) is present next to the repo; synthetic
fixtures keep the core parser covered everywhere else.
pip install -e .[dev]
pytest
📄 Format Notes (reverse-engineered)
TMAP is an undocumented proprietary format. This reader is built from binary analysis of real scanner output, cross-validated against ASlide. Both variants store plain JPEG tiles with a small binary header and index tables; there is no encryption.
- TMAP06 stores 3 pyramid levels (40x / 10x / 2.5x); TMAP07 stores up to 10 levels (40x down to 0.078x, halving each level).
- TMAP06 level-2 previews come from pre-rendered
ShrinkTileentries and are JPEG-compressed at that scale. iter_tiles()exposes the stored tile grid directly — useful for tile-based ML pipelines.- Metadata caveat: the header
pixel_sizefield cannot be trusted. Measured on real slides (cell-nucleus diameters, canvas physical size, cross-checked with ASlide), both the Henan TMAP06 batch (6.88e-05 mm) and the Shanxi TMAP07 batch (1.01e-04 mm) carry corrupt values at 40x; the true resolution is 0.25 µm/px. tmapslide keeps the raw value intmap.pixel_size_mm, exposes the corrected one viaopenslide.mpp-x/y, and records the decision intmap.mpp_source(header/derived).
📄 License
🙏 Acknowledgments
- kfbslide — the KFB reader this project is modelled after
- OpenSlide — the API this library mimics
- ASlide — its independent reverse-engineering of the TMAP06 layer/block structures (from decompiled vendor SDK) was used to cross-validate this implementation. tmapslide is an independent MIT-licensed implementation and ships no ASlide code
Release files for tmapslide 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tmapslide-0.2.2.tar.gz | 25.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tmapslide-0.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 46.2 kB
Release files / tmapslide-0.2.2.tar.gz
| Download URL | tmapslide-0.2.2.tar.gz |
|---|---|
| Size | 25.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7acd8a54ac7fb41e71c426561cffc0ce3636577d16cbeff0a3b59b54c4260eab
|
|
BLAKE2b-256 checksum How to use checksums |
b992d22522b885d70111024af8d1734f310056dbf27edcd7eae48a7908b278e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency logRelease files / tmapslide-0.2.2-py3-none-any.whl
| Download URL | tmapslide-0.2.2-py3-none-any.whl |
|---|---|
| Size | 20.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3fb8e757ef161874211dba50f48a0af4fb3f5caca8105b598273274096bb1ab1
|
|
BLAKE2b-256 checksum How to use checksums |
fa1b0a9f1ccf904b5088ebaa0e2fb91389c3628677846774ad61e243f1880bd9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency log