Exemple #1
0
    async def tex(self, evt: MessageEvent, formula: str) -> None:
        fig = plot.figure(figsize=(0.01, 0.01))
        text = fig.text(0, 0, rf"${formula}$",
                        fontsize=self.config["font_size"],
                        usetex=self.config["use_tex"])
        info = ImageInfo(thumbnail_info=ThumbnailInfo())

        output = BytesIO()
        if self.config["mode"] == "svg":
            fig.savefig(output, format="svg", bbox_inches="tight")
            data = output.getvalue()

            file_name = "tex.svg"
            info.mimetype = "image/svg+xml"
            info.size = len(data)

            bb = text.get_window_extent(fig.canvas.get_renderer())
            info.width, info.height = int(bb.width), int(bb.height)

            uri = await self.client.upload_media(data, info.mimetype, file_name)
        else:
            fig.savefig(output, dpi=300, format="png", bbox_inches="tight")
            data = output.getvalue()

            file_name = "tex.png"
            info.mimetype = "image/png"
            info.size = len(data)

            output.seek(0)
            img = Image.open(output)
            info.width, info.height = img.size

            uri = await self.client.upload_media(data, info.mimetype, file_name)

        output.seek(0)
        output.truncate(0)
        fig.savefig(output, dpi=self.config["thumbnail_dpi"], format="png", bbox_inches="tight")

        data = output.getvalue()
        info.thumbnail_url = await self.client.upload_media(data, "image/png", "tex.thumb.png")
        info.thumbnail_info.size = len(data)
        plot.close(fig)

        output.seek(0)
        img = Image.open(output)
        info.thumbnail_info.width, info.thumbnail_info.height = img.size
        img.close()
        output.close()

        await self.client.send_image(evt.room_id, uri, info=info, file_name=file_name)
Exemple #2
0
 async def _reupload(self,
                     url: URL,
                     title: Optional[str] = None,
                     dimensions: Optional[Tuple[int, int]] = None,
                     external_url: Optional[str] = None,
                     thumbnail_url: Optional[URL] = None,
                     thumbnail_dimensions: Optional[Tuple[int, int]] = None,
                     headers: Optional[Dict[str, str]] = None) -> Image:
     info = ImageInfo()
     if "user_agent" in self.config:
         headers["User-Agent"] = self.config["user_agent"]
     async with self.bot.http.get(url, headers=headers) as resp:
         data = await resp.read()
         info.size = len(data)
         info.mimetype = resp.headers["Content-Type"]
         if not info.mimetype:
             info.mimetype = magic.from_buffer(data, mime=True)
         if not title:
             title = self._get_filename(url, resp, info.mimetype)
     if dimensions:
         info.width, info.height = dimensions
     elif Pillow:
         img = Pillow.open(BytesIO(data))
         info.width, info.height = img.size
     mxc = await self.bot.client.upload_media(data, info.mimetype)
     if thumbnail_url:
         thumbnail = await self._reupload(thumbnail_url,
                                          title=title,
                                          headers=headers,
                                          dimensions=thumbnail_dimensions)
         info.thumbnail_url = thumbnail.url
         info.thumbnail_info = thumbnail.info
     return Image(url=mxc,
                  info=info,
                  title=title,
                  external_url=external_url)