1010 pil_imported = False
1111
1212
13- def image_array_to_data_uri (img , backend = "pil" , compression = 4 , ext = "png" ):
13+ def image_array_to_data_uri (
14+ img , backend = "pil" , compression = 4 , ext = "webp" , backend_kwargs = None
15+ ):
1416 """Converts a numpy array of uint8 into a base64 png or jpg string.
1517
1618 Parameters
@@ -22,8 +24,10 @@ def image_array_to_data_uri(img, backend="pil", compression=4, ext="png"):
2224 otherwise pypng.
2325 compression: int, between 0 and 9
2426 compression level to be passed to the backend
25- ext: str, 'png' or 'jpg'
27+ ext: str, 'webp', ' png', or 'jpg'
2628 compression format used to generate b64 string
29+ backend_kwargs : dict or None
30+ keyword arguments to be passed to the backend
2731 """
2832 # PIL and pypng error messages are quite obscure so we catch invalid compression values
2933 if compression < 0 or compression > 9 :
@@ -41,15 +45,25 @@ def image_array_to_data_uri(img, backend="pil", compression=4, ext="png"):
4145 if backend == "auto" :
4246 backend = "pil" if pil_imported else "pypng"
4347 if ext != "png" and backend != "pil" :
44- raise ValueError ("jpg binary strings are only available with PIL backend" )
48+ raise ValueError (
49+ "webp and jpg binary strings are only available with PIL backend"
50+ )
51+
52+ if backend_kwargs is None :
53+ backend_kwargs = {}
4554
4655 if backend == "pypng" :
4756 ndim = img .ndim
4857 sh = img .shape
4958 if ndim == 3 :
5059 img = img .reshape ((sh [0 ], sh [1 ] * sh [2 ]))
5160 w = Writer (
52- sh [1 ], sh [0 ], greyscale = (ndim == 2 ), alpha = alpha , compression = compression
61+ sh [1 ],
62+ sh [0 ],
63+ greyscale = (ndim == 2 ),
64+ alpha = alpha ,
65+ compression = compression ,
66+ ** backend_kwargs
5367 )
5468 img_png = from_array (img , mode = mode )
5569 prefix = "data:image/png;base64,"
@@ -63,13 +77,22 @@ def image_array_to_data_uri(img, backend="pil", compression=4, ext="png"):
6377 "install pillow or use `backend='pypng'."
6478 )
6579 pil_img = Image .fromarray (img )
66- if ext == "jpg" or ext == "jpeg" :
80+ if ext == "webp" :
81+ prefix = "data:image/webp;base64,"
82+ ext = "webp"
83+ elif ext == "jpg" or ext == "jpeg" :
6784 prefix = "data:image/jpeg;base64,"
6885 ext = "jpeg"
6986 else :
7087 prefix = "data:image/png;base64,"
7188 ext = "png"
7289 with BytesIO () as stream :
73- pil_img .save (stream , format = ext , compress_level = compression )
90+ pil_img .save (
91+ stream ,
92+ format = ext ,
93+ compress_level = compression ,
94+ lossless = True ,
95+ ** backend_kwargs
96+ )
7497 base64_string = prefix + base64 .b64encode (stream .getvalue ()).decode ("utf-8" )
7598 return base64_string
0 commit comments