Skip to content

Commit 3a374d6

Browse files
committed
fixes #707
1 parent 1ba077e commit 3a374d6

File tree

3 files changed

+89
-10
lines changed

3 files changed

+89
-10
lines changed

fastcore/_modidx.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@
669669
'fastcore.xtras.globtastic': ('xtras.html#globtastic', 'fastcore/xtras.py'),
670670
'fastcore.xtras.hl_md': ('xtras.html#hl_md', 'fastcore/xtras.py'),
671671
'fastcore.xtras.image_size': ('xtras.html#image_size', 'fastcore/xtras.py'),
672+
'fastcore.xtras.img_bytes': ('xtras.html#img_bytes', 'fastcore/xtras.py'),
672673
'fastcore.xtras.is_listy': ('xtras.html#is_listy', 'fastcore/xtras.py'),
673674
'fastcore.xtras.is_namedtuple': ('xtras.html#is_namedtuple', 'fastcore/xtras.py'),
674675
'fastcore.xtras.is_typeddict': ('xtras.html#is_typeddict', 'fastcore/xtras.py'),

fastcore/xtras.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@
66
from __future__ import annotations
77

88
# %% auto 0
9-
__all__ = ['spark_chars', 'UNSET', 'walk', 'globtastic', 'maybe_open', 'mkdir', 'image_size', 'bunzip', 'loads', 'loads_multi',
10-
'dumps', 'untar_dir', 'repo_details', 'shell', 'ssh', 'rsync_multi', 'run', 'open_file', 'save_pickle',
11-
'load_pickle', 'parse_env', 'expand_wildcards', 'dict2obj', 'obj2dict', 'repr_dict', 'is_listy', 'mapped',
12-
'IterLen', 'ReindexCollection', 'SaveReturn', 'trim_wraps', 'save_iter', 'asave_iter', 'friendly_name',
13-
'n_friendly_names', 'exec_eval', 'get_source_link', 'truncstr', 'sparkline', 'modify_exception',
14-
'round_multiple', 'set_num_threads', 'join_path_file', 'autostart', 'EventTimer', 'stringfmt_names',
15-
'PartialFormatter', 'partial_format', 'utc2local', 'local2utc', 'trace', 'modified_env', 'ContextManagers',
16-
'shufflish', 'console_help', 'hl_md', 'type2str', 'dataclass_src', 'Unset', 'nullable_dc', 'make_nullable',
17-
'flexiclass', 'asdict', 'vars_pub', 'is_typeddict', 'is_namedtuple', 'CachedIter', 'CachedAwaitable',
18-
'reawaitable', 'flexicache', 'time_policy', 'mtime_policy', 'timed_cache']
9+
__all__ = ['spark_chars', 'UNSET', 'walk', 'globtastic', 'maybe_open', 'mkdir', 'image_size', 'img_bytes', 'bunzip', 'loads',
10+
'loads_multi', 'dumps', 'untar_dir', 'repo_details', 'shell', 'ssh', 'rsync_multi', 'run', 'open_file',
11+
'save_pickle', 'load_pickle', 'parse_env', 'expand_wildcards', 'dict2obj', 'obj2dict', 'repr_dict',
12+
'is_listy', 'mapped', 'IterLen', 'ReindexCollection', 'SaveReturn', 'trim_wraps', 'save_iter', 'asave_iter',
13+
'friendly_name', 'n_friendly_names', 'exec_eval', 'get_source_link', 'truncstr', 'sparkline',
14+
'modify_exception', 'round_multiple', 'set_num_threads', 'join_path_file', 'autostart', 'EventTimer',
15+
'stringfmt_names', 'PartialFormatter', 'partial_format', 'utc2local', 'local2utc', 'trace', 'modified_env',
16+
'ContextManagers', 'shufflish', 'console_help', 'hl_md', 'type2str', 'dataclass_src', 'Unset', 'nullable_dc',
17+
'make_nullable', 'flexiclass', 'asdict', 'vars_pub', 'is_typeddict', 'is_namedtuple', 'CachedIter',
18+
'CachedAwaitable', 'reawaitable', 'flexicache', 'time_policy', 'mtime_policy', 'timed_cache']
1919

2020
# %% ../nbs/03_xtras.ipynb
2121
from .imports import *
@@ -126,6 +126,14 @@ def _png_size(f):
126126
d = dict(png=_png_size, gif=_gif_size, jpeg=_jpg_size)
127127
with maybe_open(fn, 'rb') as f: return d[imghdr.what(f)](f)
128128

129+
# %% ../nbs/03_xtras.ipynb
130+
def img_bytes(img, fmt='PNG'):
131+
# Convert PIL `img` to bytes in format `fmt`
132+
from io import BytesIO
133+
buf=BytesIO()
134+
img.save(buf, format=fmt)
135+
return buf.getvalue()
136+
129137
# %% ../nbs/03_xtras.ipynb
130138
def bunzip(fn):
131139
"bunzip `fn`, raising exception if output already exists"

nbs/03_xtras.ipynb

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,76 @@
435435
"test_eq(image_size(fname), (1200,803))"
436436
]
437437
},
438+
{
439+
"cell_type": "code",
440+
"execution_count": null,
441+
"metadata": {},
442+
"outputs": [],
443+
"source": [
444+
"from PIL import Image\n",
445+
"from IPython.display import Image as IPImage"
446+
]
447+
},
448+
{
449+
"cell_type": "code",
450+
"execution_count": null,
451+
"metadata": {},
452+
"outputs": [
453+
{
454+
"data": {
455+
"image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAyADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDi6KKK+ZP3EKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z",
456+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAfUlEQVR4AWL8zzAYAdNgdBTDqLNIAqORSAoYDS1SwGhokQJGQ4sUMBpapIDR0CIFjIYWKWA0tEgBo6FFChgNLVLAaGiRAkZDixQwGlqkgNHQIgWMhhYpYDS0SAGjoUUKGA0tUsBoaJECRkOLFDAaWqSA0dAiBYyGFmCkhBYAQaoBY/NmMJ4AAAAASUVORK5CYII=",
457+
"text/plain": [
458+
"<PIL.Image.Image image mode=RGB size=50x50>"
459+
]
460+
},
461+
"execution_count": null,
462+
"metadata": {},
463+
"output_type": "execute_result"
464+
}
465+
],
466+
"source": [
467+
"img = Image.new('RGB', (50, 50), color='red')\n",
468+
"img"
469+
]
470+
},
471+
{
472+
"cell_type": "code",
473+
"execution_count": null,
474+
"metadata": {},
475+
"outputs": [],
476+
"source": [
477+
"#| export\n",
478+
"def img_bytes(img, fmt='PNG'):\n",
479+
" # Convert PIL `img` to bytes in format `fmt`\n",
480+
" from io import BytesIO\n",
481+
" buf=BytesIO()\n",
482+
" img.save(buf, format=fmt)\n",
483+
" return buf.getvalue()"
484+
]
485+
},
486+
{
487+
"cell_type": "code",
488+
"execution_count": null,
489+
"metadata": {},
490+
"outputs": [
491+
{
492+
"data": {
493+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAZklEQVR4nM3OMQEAMAyAMIZ/z52B/iUK8oYiSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkrwO7D0GqAWPcq78HAAAAAElFTkSuQmCC",
494+
"text/plain": [
495+
"<IPython.core.display.Image object>"
496+
]
497+
},
498+
"execution_count": null,
499+
"metadata": {},
500+
"output_type": "execute_result"
501+
}
502+
],
503+
"source": [
504+
"ib = img_bytes(img)\n",
505+
"IPImage(ib)"
506+
]
507+
},
438508
{
439509
"cell_type": "code",
440510
"execution_count": null,

0 commit comments

Comments
 (0)