Python-PIL库中常见的图片处理方法

'''
Author: your name
Date: 2021-03-03 14:59:38
LastEditTime: 2021-03-04 11:29:14
LastEditors: Please set LastEditors
Description: In User Settings Edit
'''
from json import decoder
from typing import Mapping
from PIL import Image, ImageDraw, ImageFont
import imghdr
import glob
from os import listdir
from matplotlib import font_manager as fm, rcParams
import re
import os
import sys


class PIL_some():
    def __init__(self, in_img='123'):
        self.re_name = r"[^\/]*(?=\.)"
        self.re_type = r"(?<=\.)\w*"

        self.in_img_path = in_img
        self.get_img = Image.open(in_img)
        self.get_img_name = re.findall(self.re_name, self.in_img_path)[0]
        print(re.findall(self.re_name, self.in_img_path))
        print(re.findall(self.re_name, self.in_img_path)[1] == "")

        self.get_img_type = re.findall(self.re_type, self.in_img_path)[0]
        self.out_base_path = "草稿/base_modle/main_/out_use_img_basic/"

    def change_img(self, type_change=''):
        """[改变图片类型]

        Args:
            type_change (str, optional): [期望改变的类型]. Defaults to ''.
        """
        out_img_path = self.out_base_path+"change_img/"

        if type_change == '':
            self.get_img.save(
                out_img_path+'{}.{}'.format(self.get_img_name, self.re_type))

        elif type_change == 'jpg':
            get_img = self.get_img.convert("RGB")
            get_img.save(
                out_img_path+'{}.{}'.format(self.get_img_name, type_change))

        elif type_change == "png":
            get_img = self.get_img.convert("RGBA")
            get_img.save(
                out_img_path+'{}.{}'.format(self.get_img_name, type_change))

        print("生成图片:{}{}.{}".format(out_img_path,self.get_img_name, type_change))

    def know_img(self):
        """[识别当前图片的具体格式类型]
        """
        print("第一重格式校验--图片[{}]:{}".format(self.get_img_name, imghdr.what(self.in_img_path)))
        print("第二重格式校验--图片[{}]:{}".format(self.get_img_name, self.get_img.format))

    def resize_img(self, to_width=300, to_height=300):
        """更改图片的大小

        Args:
            to_width (int, optional): [修改后的图片长度]. Defaults to 300.
            to_height (int, optional): [修改后的图片宽度]. Defaults to 300.
        """
        out_img_path = self.out_base_path+"resize_img"

        print("原图片的长为:{}".format(max(self.get_img.size)))  # 获取当前图片的长
        print("原图片的宽为:{}".format(min(self.get_img.size)))  # 获取当前图片的宽

        img_deal = self.get_img.resize((to_width, to_height), Image.ANTIALIAS, box=None)  # 转化图片

        # 根据输入文件的类型,修改最后需要输出的文件类型。
        if self.get_img_type == "png":
            img_deal = img_deal.convert('RGBA')
        elif self.get_img_type == "jpg" or "jpeg":
            img_deal = img_deal.convert("RGB")

        img_deal.save(out_img_path+'/{}_{}_{}.{}'.format(self.get_img_name, to_width, to_height, self.get_img_type))

        print("修改图片[{}] 大小为:{}_{}".format(self.get_img_name, to_width, to_height))

        return img_deal

    def cut_img(self, width_start=0, height_start=0, width_end=100, height_end=100):
        """图片裁剪

        Args:
            width_start (int, optional): 长度裁剪起始点. Defaults to 0.
            height_start (int, optional): 宽度裁剪起始点. Defaults to 0.
            width_end (int, optional): 长度裁剪结束点. Defaults to 100.
            height_end (int, optional): 宽度裁剪结束点. Defaults to 100.
        """

        out_img_path = self.out_base_path+"cut_img"

        # (left, upper, right, lower)
        cropped = self.get_img.crop((width_start, height_start, width_end, height_end))

        cut_end_name = "{}_cut_{}_{}".format(self.get_img_name, (width_end - width_start), (height_end - height_start))

        cropped.save("{}/{}.{}".format(out_img_path, cut_end_name, self.get_img_type))

        print("裁剪图片[{}] 裁剪后大小为:{}_{}".format(self.get_img_name, width_end - width_start, height_end-height_start))

    def new_img(self, width=500, height=500, in_font="", type="png"):
        """新建一个图片

        Args:
            width (int, optional): 新图片的长. Defaults to 500.
            height (int, optional): 新图片的宽. Defaults to 500.
            in_font (str, optional): 新图片上的文案. Defaults to "".
            type (str, optional): 新图片的类型. Defaults to "png".
        """

        out_img_path = self.out_base_path+"new_img"

        # 灰色背景
        bg_color = "#EBD3D0"
        font_Color = "#32C8A6"

        # 当前图片信息
        new_size = "{}_{}".format(width, height)

        # setFont = ImageFont.truetype(fm.findfont(fm.FontProperties(family='Arial Unicode')), size=140)
        setFont = ImageFont.truetype("/System/Library/Fonts/Hiragino Sans GB.ttc", 80)

        new_img = Image.new('RGB', (int(width), int(height)), bg_color)

        fnt_size = setFont.getsize(in_font)  # 获取当前字体,文字的长度,宽度
        width, height = new_img.size  # 获取当前图片的长度,宽度

        # 调整文本到图片中心位置
        x = (width - fnt_size[0]) / 2
        y = (height - fnt_size[1]) / 2

        draw = ImageDraw.Draw(new_img)

        if in_font != '':
            draw.text((x, y), text=in_font, font=setFont, fill=font_Color)

        new_img.save('{}/{}_{}.{}'.format(out_img_path, new_size, in_font, type))

        print("新建一个图片:{}/{}_{}.{}".format(out_img_path, new_size, in_font, type))

    def add_img(self, wait_add_path='草稿/base_modle/main_/out_use_img_basic/add_img', _format='png', leftRight_or_topDown='leftRight'):
        """拼接固定路径文件夹内的图片

        Args:
            wait_add_path (str, optional): 固定的待拼接图片路径. Defaults to '草稿/base_modle/main_/out_use_img_basic/add_img'.
            _format (str, optional): 拼接后的图片类型. Defaults to 'png'.
            leftRight_or_topDown (str, optional): 左右拼接还是上下拼接. Defaults to 'leftRight'.
        """
        out_img_path = self.out_base_path+"add_img"

        # 获取当前文件夹中所有JPG图像
        im_list = [Image.open('{}/{}'.format(wait_add_path, fn))for fn in listdir(wait_add_path)]

        # 获取当前待拼接的文件夹中第一张图片的长宽
        first_width = max(im_list[0].size)
        first_heigh = min(im_list[0].size)

        # 图片转化为相同的尺寸
        resize_img = []
        for self.get_img in im_list:
            resize_ = self.resize_img(to_width=first_width, to_height=first_heigh)
            resize_img.append(resize_)

        # 拼接图片
        if leftRight_or_topDown == 'topDown':
            # 创建空白长图
            result = Image.new(resize_img[0].mode, (first_width, first_heigh * len(resize_img)))
            for i, im in enumerate(resize_img):
                result.paste(im, box=(0, i * first_heigh))
        elif leftRight_or_topDown == 'leftRight':
            # 创建空白长图
            result = Image.new(resize_img[0].mode, (first_width * len(resize_img), first_heigh))
            for i, im in enumerate(resize_img):
                result.paste(im, box=(i * first_width, 0))

        # 保存图片
        # 根据期望输出的图片类型,修改图片文件的RGBA状态。
        if _format == "png":
            result = result.convert('RGBA')
        elif _format == "png":
            result = result.convert('RGB')

        result.save('{}/result_out.{}'.format(out_img_path, _format))

        print("拼接图片完成:{}/result_out.{}".format(out_img_path, _format))

    def write_text(self, font="font"):

        out_img_path = self.out_base_path+"write_text"

        setFont = ImageFont.truetype("/System/Library/Fonts/Hiragino Sans GB.ttc", 80)

        fnt_size = setFont.getsize(font)
        width, height = self.get_img.size

        x = ((width - fnt_size[0]) / 2)
        y = ((height - fnt_size[1]) / 2)

        fillColor = "#FD2030"

        draw_img = ImageDraw.Draw(self.get_img)
        draw_img.text((x, y), text=font, font=setFont, fill=fillColor)

        self.get_img.save('{}/{}_{}.{}'.format(out_img_path, self.get_img_name, font, self.get_img_type))

        print("在指定图片上写字:{}/{}_{}.{}".format(out_img_path, self.get_img_name, font, self.get_img_type))


if __name__ == '__main__':
    img_some = PIL_some(in_img='草稿/base_modle/main_/out_use_img_basic/write_text/1_2400_1080.jpg')

    # img_some.know_img()
    # img_some.change_img(type_change='png')
    # img_some.resize_img(to_height=600, to_width=600)
    # img_some.cut_img(width_end=300, height_end=300)
    # img_some.new_img(in_font="我是新图片")
    # img_some.add_img()
    # img_some.write_text(font="我是一段文字")

# 使用需要注销方法的指定保存路径,或者新建对应路径。

我的代码文件的格式:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值