You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
3.2 KiB

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")