python图像的字符画绘制程序代码,python绘制文字的代码
人物画生成的类型
图像生成:文字大小不一,生成文字像文字云。纯文本图像的类型:
在黑白灰度图像之前,用Java写一个字符,只能画黑白图像。本文利用python PIL库实现纯文本字符绘制,可以绘制带有字符的灰度图像。
原理如下:
首先,定义一个字符集。本程序使用ASCII码中的可打印字符:32~126。其次,每个字符对应一个灰度值,不同的字符有不同的灰度值。具体如何计算一个字符的灰度值,请参考下面一张彩图。先灰度化它,缩小它(使宽度合适,使每一串不至于太长),均衡直方图(使图像灰度均匀,增强对比度)。经过以上步骤,得到一个灰色的数组。如何根据图像的灰度数组和字符的灰度值,将灰度数组映射成字符串,计算出字符的灰度值?
在一张纸上画一个字符,并计算该字符所占的面积。面积越大,字符的灰度值越大(反之亦然)。
对于直方图均衡,请检查直方图均衡。
该程序可配置如下:
更改字符集,可以包含中文字符。更改导出图片的字体和字符间距。先放张大大的靓照:
从太平航运导入图像字体,图像,图像绘制#字符集使用美国信息交换标准码码中的可打印字符charset=[chr(i) for i in range(32,127)]#计算字符灰度时,字体使用默认字体font=图像字体。load _ default()def直方图(a): #统计各个颜色出现的频率对于a中的I,CNT=[0]* 256:CNT[I]=1返回cntdef转换(a): #为各个颜色赋予新的颜色值su=sum(a)ans=[0]* 256s=0 for I in range(len(a)):s=a[I]ans[I]=int(255 * s/su)return ansdef map _ by(a,b): #根据映射b,将a数组中的元素映射为新的数组ans=[]for I in a:ans。append(b[I])return ansdef get _ grey(char):#获取单个字符的灰度SZ=字体。getsize(char)img=image。new( 1 ,sz) draw=ImageDraw .Draw(img) draw.text((0,0),char,fill= white )white _ CNT=0 for I in range(SZ[0]):for j in range(SZ[1]):if img .get pixel((I,j)):white _ CNT=1返回white _ CNT/(SZ[0]* SZ[1])def get _ charset _ grey():#获取字符集中各个字符的灰度charset _ grey=[]for I in charset:grey=get _ grey(I)charset _ grey。append((I,grey))charset _ grey=sorted(charset _ grey,key=lambda it:it[1])max _ grey=charset _ grey[-1][1]#最大灰度的字符charset_grey=list(map(lambda it:(it[0],it[1]/max_grey * 255),charset _ grey))返回charset_greydef near(a,x): #根据灰度x在"字符-灰度"列表中查找灰度最接近的字符,此处使用二分查找lo,hi=0,len(a)-1 while lo hi:mid=(hi lo)//2 if a[mid][1]==x:return a[mid][0]elif a[mid][1]x:lo=mid 1 else:hi=mid ind=lo if ind==0:return a[0][0]if ABS(a[ind][1]-x)ABS(a[ind 1][1]-x):return a[ind][0]else:return a[ind 1][0]def draw _ char(char set _ grey,im根据"字符-灰度"列表将图像数据映射成字符串s= for I in img _ data:s=near(charset _ grey,I)return sdef char _ image(img _ path,line_chars=100): #传入图片路径,将图片映射成为字符串# 首先将原图片进行灰度化、放缩、直方图均衡化img=Image.open(img_path).convert( L )height=int(line _ chars/img。尺寸[0]* img。size[1])img=img。resize((line _ chars,height))data=list(img。get data())new _ data=map _ by(data,transform(histogram(data)))charset _ grey=get _ charset _ grey()s=draw _ char(charset _ grey,new_data) s=\n .join([s[I * img。大小[0]:(I ^ 1)* img。范围内I的大小[0]](img。size[1])])返回sdef toimg(s): #将一个多行字符串画到图片上s=s . split( \ n )ch _ SZ=font。getsize()#先测试一下单字符宽高(以空格为例)ch_sz=(ch_sz[0] 2,ch_sz[1] 2) #字符之间空闲两格img=Image.new(1 ,(ch_sz[0] * len(s[0]),ch_sz[1] * len(s))) #创建新图片draw=ImageDraw .范围内I的draw(img)(len(s)):范围内j的draw(len(s[0]):draw。text((j * ch _ SZ[0],i * ch_sz[1]),s[i][j],fill= white )return imgs=char _ image( bitch。 jpg ,line _ chars=200)img=toimg(s)img。保存(‘哈哈。jpg )打印转载于:https://www。cn博客。com/weiyinfu/p/7421283。超文本标记语言
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。