22
33from __future__ import annotations
44
5- import copy
65import json
76import logging
87import math
@@ -380,7 +379,9 @@ def open( # noqa: PLR0911
380379 )
381380 return NGFFWSIReader (input_path , mpp = mpp , power = power )
382381
383- if suffixes [- 2 :] in ([".ome" , ".tiff" ],):
382+ if suffixes [- 2 :] in ([".ome" , ".tiff" ],) or suffixes [- 2 :] in (
383+ [".ome" , ".tif" ],
384+ ):
384385 return TIFFWSIReader (input_path , mpp = mpp , power = power )
385386
386387 if last_suffix in (".tif" , ".tiff" ):
@@ -477,7 +478,7 @@ def info(self: WSIReader) -> WSIMeta:
477478
478479 """
479480 if self ._m_info is not None :
480- return copy . deepcopy ( self ._m_info )
481+ return self ._m_info
481482 self ._m_info = self ._info ()
482483 if self ._manual_mpp :
483484 self ._m_info .mpp = np .array (self ._manual_mpp )
@@ -3472,7 +3473,14 @@ def __init__(
34723473 len (self .tiff .pages ) == 1 ,
34733474 ],
34743475 )
3475- if not any ([self .tiff .is_svs , self .tiff .is_ome , is_single_page_tiled ]):
3476+ if not any (
3477+ [
3478+ self .tiff .is_svs ,
3479+ self .tiff .is_ome ,
3480+ is_single_page_tiled ,
3481+ self .tiff .is_bigtiff ,
3482+ ]
3483+ ):
34763484 msg = "Unsupported TIFF WSI format."
34773485 raise ValueError (msg )
34783486
@@ -3503,9 +3511,16 @@ def page_area(page: tifffile.TiffPage) -> float:
35033511 group [0 ] = self ._zarr_group
35043512 self ._zarr_group = group
35053513 self .level_arrays = {
3506- int (key ): ArrayView (array , axes = self .info . axes )
3514+ int (key ): ArrayView (array , axes = self ._axes )
35073515 for key , array in self ._zarr_group .items ()
35083516 }
3517+ # ensure level arrays are sorted by descending area
3518+ self .level_arrays = dict (
3519+ sorted (
3520+ self .level_arrays .items (),
3521+ key = lambda x : - np .prod (self ._canonical_shape (x [1 ].array .shape [:2 ])),
3522+ )
3523+ )
35093524
35103525 def _canonical_shape (self : TIFFWSIReader , shape : IntPair ) -> tuple :
35113526 """Make a level shape tuple in YXS order.
@@ -3761,10 +3776,10 @@ def _info(self: TIFFWSIReader) -> WSIMeta:
37613776 Containing metadata.
37623777
37633778 """
3764- level_count = len (self ._zarr_group )
3779+ level_count = len (self .level_arrays )
37653780 level_dimensions = [
3766- np .array (self ._canonical_shape (p .shape )[:2 ][::- 1 ])
3767- for p in self ._zarr_group .values ()
3781+ np .array (self ._canonical_shape (p .array . shape )[:2 ][::- 1 ])
3782+ for p in self .level_arrays .values ()
37683783 ]
37693784 slide_dimensions = level_dimensions [0 ]
37703785 level_downsamples = [(level_dimensions [0 ] / x )[0 ] for x in level_dimensions ]
@@ -4007,10 +4022,10 @@ def read_rect(
40074022 # Find parameters for optimal read
40084023 (
40094024 read_level ,
4010- _ ,
4011- _ ,
4025+ level_read_location ,
4026+ level_read_size ,
40124027 post_read_scale ,
4013- baseline_read_size ,
4028+ _ ,
40144029 ) = self .find_read_rect_params (
40154030 location = location ,
40164031 size = size ,
@@ -4019,16 +4034,15 @@ def read_rect(
40194034 )
40204035
40214036 bounds = utils .transforms .locsize2bounds (
4022- location = location ,
4023- size = baseline_read_size ,
4037+ location = level_read_location ,
4038+ size = level_read_size ,
40244039 )
40254040 im_region = utils .image .safe_padded_read (
40264041 image = self .level_arrays [read_level ],
40274042 bounds = bounds ,
40284043 pad_mode = pad_mode ,
40294044 pad_constant_values = pad_constant_values ,
40304045 )
4031-
40324046 im_region = utils .transforms .imresize (
40334047 img = im_region ,
40344048 scale_factor = post_read_scale ,
@@ -4163,7 +4177,7 @@ class docstrings for more information.
41634177 # but base image is of different scale)
41644178 (
41654179 read_level ,
4166- _ ,
4180+ bounds_at_read_level ,
41674181 _ ,
41684182 post_read_scale ,
41694183 ) = self ._find_read_bounds_params (
@@ -4175,7 +4189,7 @@ class docstrings for more information.
41754189 # Find parameters for optimal read
41764190 (
41774191 read_level ,
4178- _ ,
4192+ bounds_at_read_level ,
41794193 size_at_requested ,
41804194 post_read_scale ,
41814195 ) = self ._find_read_bounds_params (
@@ -4186,7 +4200,7 @@ class docstrings for more information.
41864200
41874201 im_region = utils .image .sub_pixel_read (
41884202 image = self .level_arrays [read_level ],
4189- bounds = bounds_at_baseline ,
4203+ bounds = bounds_at_read_level ,
41904204 output_size = size_at_requested ,
41914205 interpolation = interpolation ,
41924206 pad_mode = pad_mode ,
0 commit comments