# # The Python Imaging Library # $Id$ # # WMF stub codec # # history: # 1996-12-14 fl Created # 2004-02-22 fl Turned into a stub driver # 2004-02-23 fl Added EMF support # # Copyright (c) Secret Labs AB 1997-2004. All rights reserved. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # # WMF/EMF reference documentation: # https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf # http://wvware.sourceforge.net/caolan/index.html # http://wvware.sourceforge.net/caolan/ora-wmf.html from . import Image, ImageFile from ._binary import i16le as word, i32le as dword, si16le as short, si32le as _long _handler = None def register_handler(handler): """ Install application-specific WMF image handler. :param handler: Handler object. """ global _handler _handler = handler if hasattr(Image.core, "drawwmf"): # install default handler (windows only) class WmfHandler: def open(self, im): im.mode = "RGB" self.bbox = im.info["wmf_bbox"] def load(self, im): im.fp.seek(0) # rewind return Image.frombytes( "RGB", im.size, Image.core.drawwmf(im.fp.read(), im.size, self.bbox), "raw", "BGR", (im.size[0] * 3 + 3) & -4, -1, ) register_handler(WmfHandler()) # # -------------------------------------------------------------------- # Read WMF file def _accept(prefix): return ( prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or prefix[:4] == b"\x01\x00\x00\x00" ) ## # Image plugin for Windows metafiles. class WmfStubImageFile(ImageFile.StubImageFile): format = "WMF" format_description = "Windows Metafile" def _open(self): self._inch = None # check placable header s = self.fp.read(80) if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": # placeable windows metafile # get units per inch self._inch = word(s, 14) # get bounding box x0 = short(s, 6) y0 = short(s, 8) x1 = short(s, 10) y1 = short(s, 12) # normalize size to 72 dots per inch self.info["dpi"] = 72 size = ( (x1 - x0) * self.info["dpi"] // self._inch, (y1 - y0) * self.info["dpi"] // self._inch, ) self.info["wmf_bbox"] = x0, y0, x1, y1 # sanity check (standard metafile header) if s[22:26] != b"\x01\x00\t\x00": raise SyntaxError("Unsupported WMF file format") elif dword(s) == 1 and s[40:44] == b" EMF": # enhanced metafile # get bounding box x0 = _long(s, 8) y0 = _long(s, 12) x1 = _long(s, 16) y1 = _long(s, 20) # get frame (in 0.01 millimeter units) frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) size = x1 - x0, y1 - y0 # calculate dots per inch from bbox and frame xdpi = int(2540.0 * (x1 - y0) / (frame[2] - frame[0]) + 0.5) ydpi = int(2540.0 * (y1 - y0) / (frame[3] - frame[1]) + 0.5) self.info["wmf_bbox"] = x0, y0, x1, y1 if xdpi == ydpi: self.info["dpi"] = xdpi else: self.info["dpi"] = xdpi, ydpi else: raise SyntaxError("Unsupported file format") self.mode = "RGB" self._size = size loader = self._load() if loader: loader.open(self) def _load(self): return _handler def load(self, dpi=None): if dpi is not None and self._inch is not None: self.info["dpi"] = int(dpi + 0.5) x0, y0, x1, y1 = self.info["wmf_bbox"] self._size = ( (x1 - x0) * self.info["dpi"] // self._inch, (y1 - y0) * self.info["dpi"] // self._inch, ) super().load() def _save(im, fp, filename): if _handler is None or not hasattr(_handler, "save"): raise OSError("WMF save handler not installed") _handler.save(im, fp, filename) # # -------------------------------------------------------------------- # Registry stuff Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) Image.register_save(WmfStubImageFile.format, _save) Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"])
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
BdfFontFile.py | File | 2.88 KB | 0644 |
|
BlpImagePlugin.py | File | 14.14 KB | 0644 |
|
BmpImagePlugin.py | File | 14.03 KB | 0644 |
|
BufrStubImagePlugin.py | File | 1.48 KB | 0644 |
|
ContainerIO.py | File | 2.66 KB | 0644 |
|
CurImagePlugin.py | File | 1.64 KB | 0644 |
|
DcxImagePlugin.py | File | 2.16 KB | 0644 |
|
DdsImagePlugin.py | File | 5.34 KB | 0644 |
|
EpsImagePlugin.py | File | 11.83 KB | 0644 |
|
ExifTags.py | File | 8.63 KB | 0644 |
|
FitsStubImagePlugin.py | File | 1.59 KB | 0644 |
|
FliImagePlugin.py | File | 4.29 KB | 0644 |
|
FontFile.py | File | 2.7 KB | 0644 |
|
FpxImagePlugin.py | File | 6.5 KB | 0644 |
|
FtexImagePlugin.py | File | 3.23 KB | 0644 |
|
GbrImagePlugin.py | File | 2.67 KB | 0644 |
|
GdImageFile.py | File | 2.31 KB | 0644 |
|
GifImagePlugin.py | File | 28.36 KB | 0644 |
|
GimpGradientFile.py | File | 3.26 KB | 0644 |
|
GimpPaletteFile.py | File | 1.24 KB | 0644 |
|
GribStubImagePlugin.py | File | 1.51 KB | 0644 |
|
Hdf5StubImagePlugin.py | File | 1.48 KB | 0644 |
|
IcnsImagePlugin.py | File | 11.29 KB | 0644 |
|
IcoImagePlugin.py | File | 9.95 KB | 0644 |
|
ImImagePlugin.py | File | 10.21 KB | 0644 |
|
Image.py | File | 110.17 KB | 0644 |
|
ImageChops.py | File | 6.62 KB | 0644 |
|
ImageCms.py | File | 35.21 KB | 0644 |
|
ImageColor.py | File | 8.51 KB | 0644 |
|
ImageDraw.py | File | 18.68 KB | 0644 |
|
ImageDraw2.py | File | 3.02 KB | 0644 |
|
ImageEnhance.py | File | 3.12 KB | 0644 |
|
ImageFile.py | File | 20.51 KB | 0644 |
|
ImageFilter.py | File | 15.5 KB | 0644 |
|
ImageFont.py | File | 35.22 KB | 0644 |
|
ImageGrab.py | File | 2.35 KB | 0644 |
|
ImageMath.py | File | 7.42 KB | 0644 |
|
ImageMode.py | File | 1.6 KB | 0644 |
|
ImageMorph.py | File | 7.71 KB | 0644 |
|
ImageOps.py | File | 17.63 KB | 0644 |
|
ImagePalette.py | File | 6.19 KB | 0644 |
|
ImagePath.py | File | 336 B | 0644 |
|
ImageQt.py | File | 5.83 KB | 0644 |
|
ImageSequence.py | File | 1.78 KB | 0644 |
|
ImageShow.py | File | 5.48 KB | 0644 |
|
ImageStat.py | File | 3.81 KB | 0644 |
|
ImageTransform.py | File | 2.78 KB | 0644 |
|
ImageWin.py | File | 7.01 KB | 0644 |
|
ImtImagePlugin.py | File | 2.15 KB | 0644 |
|
IptcImagePlugin.py | File | 5.51 KB | 0644 |
|
Jpeg2KImagePlugin.py | File | 8.15 KB | 0644 |
|
JpegImagePlugin.py | File | 27.18 KB | 0644 |
|
JpegPresets.py | File | 12.25 KB | 0644 |
|
McIdasImagePlugin.py | File | 1.71 KB | 0644 |
|
MicImagePlugin.py | File | 2.58 KB | 0644 |
|
MpegImagePlugin.py | File | 1.76 KB | 0644 |
|
MpoImagePlugin.py | File | 4.26 KB | 0644 |
|
MspImagePlugin.py | File | 5.39 KB | 0644 |
|
PSDraw.py | File | 6.59 KB | 0644 |
|
PaletteFile.py | File | 1.08 KB | 0644 |
|
PalmImagePlugin.py | File | 8.89 KB | 0644 |
|
PcdImagePlugin.py | File | 1.47 KB | 0644 |
|
PcfFontFile.py | File | 5.84 KB | 0644 |
|
PcxImagePlugin.py | File | 5.53 KB | 0644 |
|
PdfImagePlugin.py | File | 7.42 KB | 0644 |
|
PdfParser.py | File | 33.9 KB | 0644 |
|
PixarImagePlugin.py | File | 1.62 KB | 0644 |
|
PngImagePlugin.py | File | 26.81 KB | 0644 |
|
PpmImagePlugin.py | File | 4.35 KB | 0644 |
|
PsdImagePlugin.py | File | 7.8 KB | 0644 |
|
PyAccess.py | File | 9.13 KB | 0644 |
|
SgiImagePlugin.py | File | 5.98 KB | 0644 |
|
SpiderImagePlugin.py | File | 9.24 KB | 0644 |
|
SunImagePlugin.py | File | 4.21 KB | 0644 |
|
TarIO.py | File | 1.4 KB | 0644 |
|
TgaImagePlugin.py | File | 6.11 KB | 0644 |
|
TiffImagePlugin.py | File | 66.11 KB | 0644 |
|
TiffTags.py | File | 14.26 KB | 0644 |
|
WalImageFile.py | File | 5.34 KB | 0644 |
|
WebPImagePlugin.py | File | 10.77 KB | 0644 |
|
WmfImagePlugin.py | File | 4.5 KB | 0644 |
|
XVThumbImagePlugin.py | File | 1.9 KB | 0644 |
|
XbmImagePlugin.py | File | 2.39 KB | 0644 |
|
XpmImagePlugin.py | File | 3 KB | 0644 |
|
__init__.py | File | 1.6 KB | 0644 |
|
__main__.py | File | 41 B | 0644 |
|
_binary.py | File | 1.71 KB | 0644 |
|
_imaging.cpython-38-x86_64-linux-gnu.so | File | 406.46 KB | 0644 |
|
_imagingcms.cpython-38-x86_64-linux-gnu.so | File | 38.09 KB | 0644 |
|
_imagingft.cpython-38-x86_64-linux-gnu.so | File | 37.34 KB | 0644 |
|
_imagingmath.cpython-38-x86_64-linux-gnu.so | File | 18.43 KB | 0644 |
|
_imagingmorph.cpython-38-x86_64-linux-gnu.so | File | 14.46 KB | 0644 |
|
_tkinter_finder.py | File | 622 B | 0644 |
|
_util.py | File | 503 B | 0644 |
|
_version.py | File | 50 B | 0644 |
|
_webp.cpython-38-x86_64-linux-gnu.so | File | 24.1 KB | 0644 |
|
features.py | File | 4.46 KB | 0644 |
|