首页 > 编程语言 >Python 文本文件拖上转自适应图片 - 学习笔记(2022.11.16)

Python 文本文件拖上转自适应图片 - 学习笔记(2022.11.16)

时间:2022-11-16 00:44:35浏览次数:46  
标签:16 Python image 转自 len 图片 font self size

Python 文本文件拖上转自适应图片

功能:

  1、支持拖拽执行

  2、文本文件转为自适应尺寸图片

 1 import re
 2 import os
 3 import sys
 4 import time
 5 from PIL import Image,ImageFont,ImageDraw
 6 
 7 class CodeToPicture(object):
 8     """  源码转图片
 9     # 1、支持拖上执行
10     # 2、读取源码内容 , 兼容中文
11     # 3、保存为尺寸大小最为合适图片
12     """
13     run_path = None
14     font_color = (0,0,0,255)
15     def __init__(self):
16         self.font_file = 'c:\\windows\\Fonts\\simsun.ttc' # 宋体
17 
18     def single_len(self, string):
19         '''获取字符串的单字节长度'''
20         tab_len = string.count('\t')*4
21         cn_len = len(re.findall(r'[\u4e00-\u9fa5]',string))*2       # 中文
22         other_len = len(re.findall(r'[^\t\u4e00-\u9fa5]',string))   # 其他
23         total_len = tab_len + other_len + cn_len
24         return total_len
25 
26     # 读取文件内容
27     def read_content(self):
28         try:
29             with open(self.run_path,'r',encoding='utf-8') as f:
30                 return f.read()
31         except Exception as e:
32             print(e)
33 
34     # 保存为图片
35     def save_image(self, text):
36         fontsize = 20      # 字体大小
37         image_width = 1920 # 图片宽度
38         image_height = 0   # 图片高度
39         row_size = 5       # 文字行距
40         column_size = 5    # 行首缩进
41         image_name = os.path.splitext(os.path.basename(self.run_path))[0] # 获取文件名,不包含文件后缀
42         try:
43             if self.font_file:
44                 font = ImageFont.truetype(font=self.font_file, size=fontsize)
45             else:
46                 font = ImageFont.truetype(font='simsun.ttc', size=fontsize) # 使用宋体,兼容\t
47         except Exception as e:
48             # 系统字体:黑体simhei.ttf、楷体simkai.ttf、雅黑msyh.ttc、仿宋simfang.ttf,均不兼容\t
49             font = ImageFont.truetype(font='simhei.ttf', size=fontsize) # 系统字体黑体,不兼容\t
50         lines = text.split('\n')                          # 计算行数
51         row_num = len(lines)                              # 总共的行数
52         line_max = max(lines, key=self.single_len)        # 单字节最大的行
53         left, top, right, bottom = font.getbbox( line_max )
54 
55         # 计算图片高度
56         image_height = (bottom + row_size) * row_num  # 图片高度
57         image_width = column_size*2 + right           # 图片宽度:行首缩进+行尾缩进+tab长度+中文长度
58         image_size = (image_width, image_height)      # 图片尺寸
59 
60         im = Image.new( mode='RGBA',size=image_size, color=self.font_color) # (宽度1920,高度1080)
61         draw = ImageDraw.Draw(im)
62         for n,line in enumerate(text.split('\n')):
63             draw.text((column_size, (bottom + row_size)*n), line, font=font, fill=(0,0,0,0))
64         im.save( "{}_{}_{}.png".format(
65                     image_name,
66                     "%d&%d"%(image_width,image_height),
67                     time.strftime( '%Y-%m-%d_%H-%M-%S', time.localtime() )
68                     ) )
69 
70     def run(self):
71         data = self.read_content()
72         self.save_image(data)
73         print('图片保存成功!')
74         
75 if __name__ == '__main__':
76     try:
77         if sys.argv[1]:
78             ctp = CodeToPicture()
79             ctp.run_path = sys.argv[1]
80             ctp.run()
81     except Exception as e:
82         print(e)
83         time.sleep(10)

实现效果:

 

标签:16,Python,image,转自,len,图片,font,self,size
From: https://www.cnblogs.com/lieqi-vip/p/16894548.html

相关文章

  • 如何正确遵守 Python 代码规范
    前言无规矩不成方圆,代码亦是如此,本篇文章将会介绍一些自己做项目时遵守的较为常用的Python代码规范。命名大小写模块名写法:module_name包名写法:package_nam......
  • python 中 循环结构同时传入多个参数
     001、>>>list1=[("aa",100,400),("bb","kk","yy"),(33,400,500)]>>>fori,j,kinlist1:##利用列表、元组同时传入多个参数...print(i,......
  • python 中统计每一个字符串中每一个字符出现的次数
     001、直接使用字典进行统计>>>str1="aaaabbcdddefff"##测试字符串>>>dict1=dict()>>>foriinstr1:##利用条件分支进行判断.........
  • Python 中的 defaultdict 数据类型
     首先,defaultdict是dict的一个子类。通常Python中字典(dict)是通过键值对来存取的,当索引一个不存在的键时,就会引发keyerror异常。那么,defaultdict就可以解决这个......
  • python中的公共操作和推导式
    #1.公共操作#del删除删除变量或指定容器内数据变量,容器里面的值#+将两个相同类型序列进行连接字符串,列表,元组print('1.公共操作')print('a'+'b')print([......
  • python-if where for-函数
    一、if-where-for1、If:判断语句: if+条件:              elif+条件:              else:后面不能加条件实......
  • python 中 filter函数的用法
     和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。 ......
  • python 中内建函数map的用法
     map函数会根据提供的函数对指定序列做映射。通过定义可以看到,这个函数的第一个参数是一个函数,剩下的参数是一个或多个序列,返回值是一个集合。map的作用是以参数序列中......
  • python脚本check linux
    check脚本:importparamikoimportConfigParserimportsys#-*-coding:UTF-8-*-username="root"pwd="YDYP1F1@flzx3kc"host_ip=[]reload(sys)sys.setdefaulten......
  • Python读取写入txt内容
    Python读取、写入txt内容withopen("test.txt","r")asf:#打开文件data=f.read()#读取文件print(data)withopen("test.txt","w")asf:......