50 lines
1.9 KiB
Python
50 lines
1.9 KiB
Python
import tempfile
|
|
|
|
from PIL import Image
|
|
from telegram import Update
|
|
from telegram.ext import Dispatcher, CallbackContext, MessageHandler, Filters
|
|
|
|
from bots.models import TelegramBotModuleConfig
|
|
|
|
|
|
class StickersBotModuleConfig(TelegramBotModuleConfig):
|
|
MODULE_NAME = 'Stickers'
|
|
|
|
def resize_image(self, update: Update, ctx: CallbackContext):
|
|
doc = update.message.document
|
|
if update.message.photo:
|
|
with tempfile.NamedTemporaryFile(suffix='.jpg') as f:
|
|
f.write(update.message.photo[-1].get_file().download_as_bytearray())
|
|
f.seek(0)
|
|
im = Image.open(f).convert('RGBA')
|
|
else:
|
|
if doc.mime_type == 'image/png':
|
|
suffix = '.png'
|
|
elif doc.mime_type == 'image/jpeg':
|
|
suffix = '.jpg'
|
|
else:
|
|
return
|
|
with tempfile.NamedTemporaryFile(suffix=suffix) as f:
|
|
f.write(doc.get_file().download_as_bytearray())
|
|
f.seek(0)
|
|
im = Image.open(f).convert('RGBA')
|
|
width, height = im.size
|
|
long_dimension = max(width, height)
|
|
scale_ratio = 512 / long_dimension
|
|
target_width = int(width * scale_ratio)
|
|
target_height = int(height * scale_ratio)
|
|
if long_dimension == width:
|
|
target_width = 512
|
|
else:
|
|
target_height = 512
|
|
im = im.resize((target_width, target_height), Image.LANCZOS)
|
|
with tempfile.NamedTemporaryFile(suffix='.png') as f:
|
|
im.quantize(method=2).save(f, 'png')
|
|
f.seek(0)
|
|
update.message.reply_document(f, caption=f'{width}x{height} -> {target_width}x{target_height}')
|
|
|
|
def build_dispatcher(self, dispatcher: Dispatcher):
|
|
dispatcher.add_handler(MessageHandler(Filters.document, self.resize_image))
|
|
dispatcher.add_handler(MessageHandler(Filters.photo, self.resize_image))
|
|
return dispatcher
|