Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/openpyxl/drawing/image.py: 28%
40 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1# Copyright (c) 2010-2022 openpyxl
3from io import BytesIO
5try:
6 from PIL import Image as PILImage
7except ImportError:
8 PILImage = False
11def _import_image(img):
12 if not PILImage:
13 raise ImportError('You must install Pillow to fetch image objects')
15 if not isinstance(img, PILImage.Image):
16 img = PILImage.open(img)
18 return img
21class Image(object):
22 """Image in a spreadsheet"""
24 _id = 1
25 _path = "/xl/media/image{0}.{1}"
26 anchor = "A1"
28 def __init__(self, img):
30 self.ref = img
31 mark_to_close = isinstance(img, str)
32 image = _import_image(img)
33 self.width, self.height = image.size
35 try:
36 self.format = image.format.lower()
37 except AttributeError:
38 self.format = "png"
39 if mark_to_close:
40 # PIL instances created for metadata should be closed.
41 image.close()
44 def _data(self):
45 """
46 Return image data, convert to supported types if necessary
47 """
48 img = _import_image(self.ref)
49 # don't convert these file formats
50 if self.format in ['gif', 'jpeg', 'png']:
51 img.fp.seek(0)
52 fp = img.fp
53 else:
54 fp = BytesIO()
55 img.save(fp, format="png")
56 fp.seek(0)
58 data = fp.read()
59 fp.close()
60 return data
63 @property
64 def path(self):
65 return self._path.format(self._id, self.format)