@@ -174,7 +174,9 @@ def read_acquisition(
174
174
img [:, ys , xs ] = np .transpose (data [:, 3 :])
175
175
return img
176
176
177
- def read_slide (self , slide : Slide ) -> Optional [np .ndarray ]:
177
+ def read_slide (
178
+ self , slide : Slide , raw : bool = False
179
+ ) -> Union [np .ndarray , bytes , None ]:
178
180
"""Reads and decodes a slide image as numpy array using the ``imageio``
179
181
package.
180
182
@@ -199,22 +201,25 @@ def read_slide(self, slide: Slide) -> Optional[np.ndarray]:
199
201
if data_start_offset == data_end_offset == 0 :
200
202
return None
201
203
data_start_offset += 161
204
+ data_end_offset -= 1
202
205
if data_start_offset >= data_end_offset :
203
206
raise IOError (
204
207
f"MCD file '{ self .path .name } ' corrupted: "
205
208
f"invalid image data offsets for slide { slide .id } "
206
209
)
207
210
try :
208
211
return self ._read_image (
209
- data_start_offset , data_end_offset - data_start_offset
212
+ data_start_offset , data_end_offset - data_start_offset , raw
210
213
)
211
214
except Exception as e :
212
215
raise IOError (
213
216
f"MCD file '{ self .path .name } ' corrupted: "
214
217
f"cannot read image for slide { slide .id } "
215
218
) from e
216
219
217
- def read_panorama (self , panorama : Panorama ) -> np .ndarray :
220
+ def read_panorama (
221
+ self , panorama : Panorama , raw : bool = False
222
+ ) -> Union [np .ndarray , bytes , None ]:
218
223
"""Reads and decodes a panorama image as numpy array using the
219
224
``imageio`` package.
220
225
@@ -229,15 +234,18 @@ def read_panorama(self, panorama: Panorama) -> np.ndarray:
229
234
f"MCD file '{ self .path .name } ' corrupted: "
230
235
f"cannot locate image data for panorama { panorama .id } "
231
236
) from e
237
+ if data_start_offset == data_end_offset == 0 :
238
+ return None
232
239
data_start_offset += 161
240
+ data_end_offset -= 1
233
241
if data_start_offset >= data_end_offset :
234
242
raise IOError (
235
243
f"MCD file '{ self .path .name } ' corrupted: "
236
244
f"invalid image data offsets for panorama { panorama .id } "
237
245
)
238
246
try :
239
247
return self ._read_image (
240
- data_start_offset , data_end_offset - data_start_offset
248
+ data_start_offset , data_end_offset - data_start_offset , raw
241
249
)
242
250
except Exception as e :
243
251
raise IOError (
@@ -246,8 +254,8 @@ def read_panorama(self, panorama: Panorama) -> np.ndarray:
246
254
) from e
247
255
248
256
def read_before_ablation_image (
249
- self , acquisition : Acquisition
250
- ) -> Optional [np .ndarray ]:
257
+ self , acquisition : Acquisition , raw : bool = False
258
+ ) -> Union [np .ndarray , bytes , None ]:
251
259
"""Reads and decodes a before-ablation image as numpy array using the
252
260
``imageio`` package.
253
261
@@ -270,6 +278,7 @@ def read_before_ablation_image(
270
278
if data_start_offset == data_end_offset == 0 :
271
279
return None
272
280
data_start_offset += 161
281
+ data_end_offset -= 1
273
282
if data_start_offset >= data_end_offset :
274
283
raise IOError (
275
284
f"MCD file '{ self .path .name } ' corrupted: "
@@ -278,7 +287,7 @@ def read_before_ablation_image(
278
287
)
279
288
try :
280
289
return self ._read_image (
281
- data_start_offset , data_end_offset - data_start_offset
290
+ data_start_offset , data_end_offset - data_start_offset , raw
282
291
)
283
292
except Exception as e :
284
293
raise IOError (
@@ -288,8 +297,8 @@ def read_before_ablation_image(
288
297
) from e
289
298
290
299
def read_after_ablation_image (
291
- self , acquisition : Acquisition
292
- ) -> Optional [np .ndarray ]:
300
+ self , acquisition : Acquisition , raw : bool = False
301
+ ) -> Union [np .ndarray , bytes , None ]:
293
302
"""Reads and decodes a after-ablation image as numpy array using the
294
303
``imageio`` package.
295
304
@@ -312,6 +321,7 @@ def read_after_ablation_image(
312
321
if data_start_offset == data_end_offset == 0 :
313
322
return None
314
323
data_start_offset += 161
324
+ data_end_offset -= 1
315
325
if data_start_offset >= data_end_offset :
316
326
raise IOError (
317
327
f"MCD file '{ self .path .name } ' corrupted: "
@@ -320,7 +330,7 @@ def read_after_ablation_image(
320
330
)
321
331
try :
322
332
return self ._read_image (
323
- data_start_offset , data_end_offset - data_start_offset
333
+ data_start_offset , data_end_offset - data_start_offset , raw
324
334
)
325
335
except Exception as e :
326
336
raise IOError (
@@ -358,12 +368,17 @@ def _read_schema_xml(
358
368
data = mm .read (end_index + len (end_sub_encoded ) - start_index )
359
369
return data .decode (encoding = encoding )
360
370
361
- def _read_image (self , data_offset : int , data_size : int ) -> np .ndarray :
371
+ def _read_image (
372
+ self , data_offset : int , data_size : int , raw : bool = False
373
+ ) -> Union [np .ndarray , bytes ]:
362
374
if self ._fh is None :
363
375
raise IOError (f"MCD file '{ self .path .name } ' has not been opened" )
364
376
self ._fh .seek (data_offset )
365
377
data = self ._fh .read (data_size )
366
- return imread (data )
378
+ if raw :
379
+ return data
380
+ else :
381
+ return imread (data )
367
382
368
383
def __repr__ (self ) -> str :
369
384
return str (self ._path )
0 commit comments