gallery.accords-library.com/server/szurubooru/util/images.py

50 lines
1.3 KiB
Python

import subprocess
from szurubooru import errors
_SCALE_FIT_FMT = \
r'scale=iw*max({width}/iw\,{height}/ih):ih*max({width}/iw\,{height}/ih)'
class Image(object):
def __init__(self, content):
self.content = content
def resize_fill(self, width, height):
self.content = self._execute([
'-i', '-',
'-f', 'image2',
'-vf', _SCALE_FIT_FMT.format(width=width, height=height),
'-vframes', '1',
'-vcodec', 'png',
'-',
])
def to_png(self):
return self._execute([
'-i', '-',
'-f', 'image2',
'-vframes', '1',
'-vcodec', 'png',
'-',
])
def to_jpeg(self):
return self._execute([
'-i', '-',
'-f', 'image2',
'-vframes', '1',
'-vcodec', 'mjpeg',
'-',
])
def _execute(self, cli):
proc = subprocess.Popen(
['ffmpeg', '-loglevel', '24'] + cli,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = proc.communicate(input=self.content)
if proc.returncode != 0:
raise errors.ProcessingError(
'Error while processing image.\n' + err.decode('utf-8'))
return out