@@ -188,6 +188,56 @@ OpenSlide objects
188
188
Close the OpenSlide object.
189
189
190
190
191
+ Color management
192
+ ----------------
193
+
194
+ Every slide region, associated image, thumbnail, and Deep Zoom tile produced
195
+ by OpenSlide Python includes a reference to an ICC color profile whenever a
196
+ profile is available for the underlying pixel data. Profiles are stored as
197
+ a :class: `bytes ` object in
198
+ :attr: `Image.info <PIL.Image.Image.info> `:attr: `['icc_profile'] `. If no
199
+ profile is available, the :attr: `icc_profile ` dictionary key is absent.
200
+
201
+ To include the profile in an image file when saving the image to disk::
202
+
203
+ image.save(filename, icc_profile=image.info.get('icc_profile'))
204
+
205
+ To perform color conversions using the profile, import it into
206
+ :mod: `ImageCms <PIL.ImageCms> `. For example, to convert an image in-place
207
+ to a synthesized sRGB profile, using absolute colorimetric rendering::
208
+
209
+ from io import BytesIO
210
+ from PIL import ImageCms
211
+
212
+ fromProfile = ImageCms.getOpenProfile(BytesIO(image.info['icc_profile']))
213
+ toProfile = ImageCms.createProfile('sRGB')
214
+ ImageCms.profileToProfile(
215
+ image, fromProfile, toProfile,
216
+ ImageCms.Intent.ABSOLUTE_COLORIMETRIC, 'RGBA', True, 0
217
+ )
218
+
219
+ Absolute colorimetric rendering `maximizes the comparability `_ of images
220
+ produced by different scanners. When converting Deep Zoom tiles, use
221
+ ``'RGB' `` instead of ``'RGBA' ``.
222
+
223
+ All pyramid regions in a slide have the same profile, but each associated
224
+ image can have its own profile. As a convenience, the former is also
225
+ available as :attr: `OpenSlide.color_profile `, already parsed into an
226
+ :class: `~PIL.ImageCms.ImageCmsProfile ` object. You can save processing time
227
+ by building an :class: `~PIL.ImageCms.ImageCmsTransform ` for the slide and
228
+ reusing it for multiple slide regions::
229
+
230
+ toProfile = ImageCms.createProfile('sRGB')
231
+ transform = ImageCms.buildTransform(
232
+ slide.color_profile, toProfile, 'RGBA', 'RGBA',
233
+ ImageCms.Intent.ABSOLUTE_COLORIMETRIC, 0
234
+ )
235
+ # for each region image:
236
+ ImageCms.applyTransform(image, transform, True)
237
+
238
+ .. _maximizes the comparability : https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4478790/
239
+
240
+
191
241
Caching
192
242
-------
193
243
0 commit comments