/usr/lib/python3/dist-packages/openpyxl/drawing/image.py is in python3-openpyxl 2.4.9-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | from __future__ import absolute_import
from __future__ import division
# Copyright (c) 2010-2017 openpyxl
from io import BytesIO
from .drawing import Drawing
from openpyxl.compat import deprecated
def bounding_box(bw, bh, w, h):
"""
Returns a tuple (new_width, new_height) which has the property
that it fits within box_width and box_height and has (close to)
the same aspect ratio as the original size
"""
new_width, new_height = w, h
if bw and new_width > bw:
new_width = bw
new_height = new_width / (w / h)
if bh and new_height > bh:
new_height = bh
new_width = new_height * (w / h)
return (new_width, new_height)
def _import_image(img):
try:
try:
import Image as PILImage
except ImportError:
from PIL import Image as PILImage
except ImportError:
raise ImportError('You must install PIL to fetch image objects')
if not isinstance(img, PILImage.Image):
img = PILImage.open(img)
return img
class Image(object):
""" Raw Image class """
_id = 1
_path = "/xl/media/image{0}.{1}"
def __init__(self, img, coordinates=((0, 0), (1, 1)), size=(None, None),
nochangeaspect=True, nochangearrowheads=True):
self.ref = img
# don't keep the image open
image = _import_image(img)
self.format = image.format.lower()
self.nochangeaspect = nochangeaspect # deprecated
self.nochangearrowheads = nochangearrowheads # deprecated
newsize = bounding_box(
size[0], size[1],
image.size[0], image.size[1]
)
size = newsize
# the containing drawing
self.drawing = Drawing()
self.drawing.coordinates = coordinates # deprecated
self.drawing.width = size[0]
self.drawing.height = size[1]
@deprecated("Anchors can be passed in when an image is added to a worksheet")
def anchor(self, cell, anchortype="absolute"):
""" anchors the image to the given cell
optional parameter anchortype supports 'absolute' or 'oneCell'"""
self.drawing.anchortype = anchortype
if anchortype == "absolute":
self.drawing.left, self.drawing.top = cell.anchor
return ((cell.column, cell.row),
cell.parent.point_pos(self.drawing.top + self.drawing.height,
self.drawing.left + self.drawing.width))
elif anchortype == "oneCell":
self.drawing.anchorcol = cell.col_idx - 1
self.drawing.anchorrow = cell.row - 1
return ((self.drawing.anchorcol, self.drawing.anchorrow), None)
else:
raise ValueError("unknown anchortype %s" % anchortype)
def _data(self):
"""
Open image and write it to a buffer when saving the workbook
"""
img = _import_image(self.ref)
fp = None
# don't convert these file formats
if self.format in ['gif', 'jpeg', 'png']:
if img.fp:
img.fp.seek(0)
fp = img.fp
if not fp:
fp = BytesIO()
img.save(fp, format=self.format)
return fp.read()
@property
def path(self):
return self._path.format(self._id, self.format)
|