В модуль добавлен объект ImageMagick для получения размеров изображения, изменения размеров изображения для формата backgrounds, с поддержкой запуска через chroot.master
parent
19f92a0fe4
commit
933ab35b1c
@ -0,0 +1,92 @@
|
|||||||
|
import os
|
||||||
|
import hashlib
|
||||||
|
from calculate.utils.files import Process, write_file, read_file
|
||||||
|
|
||||||
|
class ImageMagickError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class ImageMagick:
|
||||||
|
def __init__(self, prefix='/'):
|
||||||
|
self.prefix = prefix
|
||||||
|
self.init_commands(prefix)
|
||||||
|
self.default_opts = []
|
||||||
|
|
||||||
|
@property
|
||||||
|
def available(self):
|
||||||
|
return self.convert_cmd and self.identify_cmd
|
||||||
|
|
||||||
|
@property
|
||||||
|
def chroot(self):
|
||||||
|
return self.prefix != '/'
|
||||||
|
|
||||||
|
def init_commands(self, prefix):
|
||||||
|
self.convert_cmd = "/usr/bin/convert"
|
||||||
|
self.identify_cmd = "/usr/bin/identify"
|
||||||
|
self.chroot_cmd = "/bin/chroot"
|
||||||
|
self.bash_cmd = "/bin/bash"
|
||||||
|
if not os.path.exists(os.path.join(prefix, self.convert_cmd[1:])):
|
||||||
|
self.convert_cmd = None
|
||||||
|
if not os.path.exists(os.path.join(prefix, self.identify_cmd[1:])):
|
||||||
|
self.identify_cmd = None
|
||||||
|
|
||||||
|
def trim_prefix_path(self, filename):
|
||||||
|
retpath = "/%s" % os.path.relpath(filename, self.prefix)
|
||||||
|
if retpath.startswith("/.."):
|
||||||
|
return None
|
||||||
|
return retpath
|
||||||
|
|
||||||
|
def get_image_resolution(self, source):
|
||||||
|
if self.chroot:
|
||||||
|
identify = Process(self.chroot_cmd, self.prefix,
|
||||||
|
self.bash_cmd, "-c",
|
||||||
|
" ".join([self.identify_cmd,
|
||||||
|
"-format '%w %h'", source]))
|
||||||
|
else:
|
||||||
|
identify = Process(self.identify_cmd, "-format", "%w %h", source)
|
||||||
|
if identify.success():
|
||||||
|
swidth, _sep, sheight = identify.read().strip().partition(" ")
|
||||||
|
if swidth.isdigit() and sheight.isdigit():
|
||||||
|
return int(swidth), int(sheight)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def convert(self, source, target, *opts):
|
||||||
|
command = [self.convert_cmd, "-quality", "95",
|
||||||
|
source]
|
||||||
|
command.extend(self.default_opts)
|
||||||
|
command.extend(opts)
|
||||||
|
command.append(target)
|
||||||
|
if self.chroot:
|
||||||
|
convert = Process(self.chroot_cmd, self.prefix,
|
||||||
|
self.bash_cmd, "-c",
|
||||||
|
" ".join(command))
|
||||||
|
else:
|
||||||
|
convert = Process(*command)
|
||||||
|
if convert.success():
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(convert.read_error())
|
||||||
|
return False
|
||||||
|
|
||||||
|
def convert_resize_crop_center(self, source, target, height, width):
|
||||||
|
#if ((width == self.source_width and height == self.source_height) and
|
||||||
|
# (source.rpartition('.')[2] == target.rpartition('.')[2])):
|
||||||
|
# with write_file(target) as sf:
|
||||||
|
# sf.write(read_file(source))
|
||||||
|
# return True
|
||||||
|
res = "%dx%d" % (width, height)
|
||||||
|
|
||||||
|
return self.convert(source, target, "-quality", "95",
|
||||||
|
"-resize", "%s^" % res,
|
||||||
|
"-strip", "-gravity", "center",
|
||||||
|
"-crop", "%s+0+0" % res)
|
||||||
|
|
||||||
|
def convert_resize_gfxboot(self, source, target, height, width):
|
||||||
|
res = "%dx%d" % (width, height)
|
||||||
|
|
||||||
|
return self.convert(source, target, "-quality", "95",
|
||||||
|
"-resize", "%s^" % res,
|
||||||
|
"-strip", "-gravity", "center",
|
||||||
|
"-crop", "%s+0+0" % res,
|
||||||
|
"-sampling-factor", "2x2",
|
||||||
|
"-interlace", "none",
|
||||||
|
"-set", "units", "PixelsPerSecond")
|
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 5.4 KiB |
@ -0,0 +1 @@
|
|||||||
|
NOFILE
|
Loading…
Reference in new issue