##// END OF EJS Templates
Add JPEG as an image format for inline backend if PIL/pillow is available.
Daniel B. Vasquez -
Show More
@@ -94,8 +94,8 b' def figsize(sizex, sizey):'
94 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
94 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
95
95
96
96
97 def print_figure(fig, fmt='png'):
97 def print_figure(fig, fmt='png', quality=90):
98 """Convert a figure to svg or png for inline display."""
98 """Convert a figure to svg, jpg (if PIL is installed) or png for inline display."""
99 from matplotlib import rcParams
99 from matplotlib import rcParams
100 # When there's an empty figure, we shouldn't return anything, otherwise we
100 # When there's an empty figure, we shouldn't return anything, otherwise we
101 # get big blank areas in the qt console.
101 # get big blank areas in the qt console.
@@ -110,7 +110,7 b" def print_figure(fig, fmt='png'):"
110 dpi = dpi * 2
110 dpi = dpi * 2
111 fmt = 'png'
111 fmt = 'png'
112 fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight',
112 fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight',
113 facecolor=fc, edgecolor=ec, dpi=dpi)
113 facecolor=fc, edgecolor=ec, dpi=dpi, quality=quality)
114 data = bytes_io.getvalue()
114 data = bytes_io.getvalue()
115 return data
115 return data
116
116
@@ -163,7 +163,7 b' def mpl_runner(safe_execfile):'
163 return mpl_execfile
163 return mpl_execfile
164
164
165
165
166 def select_figure_format(shell, fmt):
166 def select_figure_format(shell, fmt, quality):
167 """Select figure format for inline backend, can be 'png', 'retina', or 'svg'.
167 """Select figure format for inline backend, can be 'png', 'retina', or 'svg'.
168
168
169 Using this method ensures only one figure format is active at a time.
169 Using this method ensures only one figure format is active at a time.
@@ -173,10 +173,14 b' def select_figure_format(shell, fmt):'
173
173
174 svg_formatter = shell.display_formatter.formatters['image/svg+xml']
174 svg_formatter = shell.display_formatter.formatters['image/svg+xml']
175 png_formatter = shell.display_formatter.formatters['image/png']
175 png_formatter = shell.display_formatter.formatters['image/png']
176 jpg_formatter = shell.display_formatter.formatters['image/jpeg']
176
177
177 if fmt == 'png':
178 if fmt == 'png':
178 svg_formatter.pop(Figure, None)
179 svg_formatter.pop(Figure, None)
179 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png'))
180 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png'))
181 elif fmt in ('jpg', 'jpeg'):
182 svg_formatter.type_printers.pop(Figure, None)
183 jpg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'jpg', quality))
180 elif fmt in ('png2x', 'retina'):
184 elif fmt in ('png2x', 'retina'):
181 svg_formatter.pop(Figure, None)
185 svg_formatter.pop(Figure, None)
182 png_formatter.for_type(Figure, retina_figure)
186 png_formatter.for_type(Figure, retina_figure)
@@ -338,5 +342,5 b' def configure_inline_support(shell, backend):'
338 del shell._saved_rcParams
342 del shell._saved_rcParams
339
343
340 # Setup the default figure format
344 # Setup the default figure format
341 select_figure_format(shell, cfg.figure_format)
345 select_figure_format(shell, cfg.figure_format, cfg.quality)
342
346
@@ -14,13 +14,19 b' This module does not import anything from matplotlib.'
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15
15
16 from IPython.config.configurable import SingletonConfigurable
16 from IPython.config.configurable import SingletonConfigurable
17 from IPython.utils.traitlets import Dict, Instance, CaselessStrEnum, Bool
17 from IPython.utils.traitlets import Dict, Instance, CaselessStrEnum, Bool, Int
18 from IPython.utils.warn import warn
18 from IPython.utils.warn import warn
19
19
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21 # Configurable for inline backend options
21 # Configurable for inline backend options
22 #-----------------------------------------------------------------------------
22 #-----------------------------------------------------------------------------
23
23
24 try:
25 from PIL import Image
26 has_pil = True
27 except:
28 has_pil = False
29
24 # inherit from InlineBackendConfig for deprecation purposes
30 # inherit from InlineBackendConfig for deprecation purposes
25 class InlineBackendConfig(SingletonConfigurable):
31 class InlineBackendConfig(SingletonConfigurable):
26 pass
32 pass
@@ -53,7 +59,20 b' class InlineBackend(InlineBackendConfig):'
53 inline backend."""
59 inline backend."""
54 )
60 )
55
61
56 figure_format = CaselessStrEnum(['svg', 'png', 'retina'], default_value='png', config=True,
62 fmts = ['svg', 'png', 'retina']
63
64 if has_pil:
65 # If we have PIL using jpeg as inline image format can save some bytes.
66 fmts.append('jpg')
67
68 # Matplotlib's JPEG printer supports a quality option that can be tweaked.
69 # We expose it only if PIL is available so the user isn't confused. But it
70 # isn't guarded by "has_pil" test because core/pylabtools.py expects this
71 # field OR we need to propagate the has_pil test to that module too.
72 quality = Int(default_value=90, config=has_pil,
73 help="Quality of compression [0-100], currently for lossy JPEG only.")
74
75 figure_format = CaselessStrEnum(fmts, default_value='png', config=True,
57 help="The image format for figures with the inline backend.")
76 help="The image format for figures with the inline backend.")
58
77
59 def _figure_format_changed(self, name, old, new):
78 def _figure_format_changed(self, name, old, new):
General Comments 0
You need to be logged in to leave comments. Login now