moear_api_common.utils.img 源代码

from io import BytesIO
from PIL import Image


[文档]def rescale_image( data, maxsizeb=4000000, dimen=None, png2jpg=False, graying=True, reduceto=(600, 800)): ''' 若 ``png2jpg`` 为 ``True`` 则将图片转换为 ``JPEG`` 格式,所有透明像素被设置为 *白色* 。确保结果图片尺寸小于 ``maxsizeb`` 的约束限制。 如果 ``dimen`` 不为空,则生成一个相应约束的缩略图。依据 ``dimen`` 的类型,设置约束为 ``width=dimen, height=dimen`` 或者 ``width, height = dimen`` :param data: 原始图片字节数据 :type data: bytes or io.BytesIO :param int maxsizeb: 文件大小约束,单位:字节 :param dimen: 缩略图尺寸约束,宽&高 :type dimen: int or (int, int) :param bool png2jpg: 是否将图片转换为 JPG 格式 :param bool graying: 是否将图片进行灰度处理 :param reduceto: 若图片大于此约束则进行相应缩小处理,宽&高 :type reduceto: (int, int) :return: 处理后的图片字节数据,可直接以 ``wb`` 模式输出到文件中 :rtype: bytes ''' if not isinstance(data, BytesIO): data = BytesIO(data) img = Image.open(data) width, height = img.size fmt = img.format if graying and img.mode != "L": img = img.convert("L") reducewidth, reduceheight = reduceto if dimen is not None: if hasattr(dimen, '__len__'): width, height = dimen else: width = height = dimen img.thumbnail((width, height)) if png2jpg and fmt == 'PNG': fmt = 'JPEG' data = BytesIO() img.save(data, fmt) elif width > reducewidth or height > reduceheight: ratio = min( float(reducewidth) / float(width), float(reduceheight) / float(height)) img = img.resize(( int(width * ratio), int(height * ratio)), Image.ANTIALIAS) if png2jpg and fmt == 'PNG': fmt = 'JPEG' data = BytesIO() img.save(data, fmt) elif png2jpg and fmt == 'PNG': data = BytesIO() img.save(data, 'JPEG') else: data = BytesIO() img.save(data, fmt) return data.getvalue()
[文档]def gray_image(data): ''' 灰度化图片 将传入的图片数据转换为灰度图后返回 :param data bytes: 图片字节数据,可通过以 ``rb`` 模式读取图片文件获得 :return: 处理后的图片字节数据,可直接以 ``wb`` 模式输出到文件中 :rtype: bytes ''' if not isinstance(data, BytesIO): data = BytesIO(data) img = Image.open(data) fmt = img.format if img.mode != "L": img = img.convert("L") data = BytesIO() img.save(data, fmt) return data.getvalue()