猫史档案馆


【少院士讲堂】第四期:用Python做一个图片转黑白字符画程序

用户:Leo韩Leo韩查看:3 回复:20 评论:3 创建时间:2020-06-21T07:33:34


嘿大家好,我是蜷缩在少院士墙角的萌新Leo韩,今天我就来教大家如何用python来生成字符画吧~首先看一下效果:

center_image

原图

center_image

处理后的图

(本图是三叶大佬的头像23333)

然后直接上代码

from PIL import Image,ImageDraw
import matplotlib.pyplot as plt

width,height=(60,60)

name1 = input("请输入待处理文件的文件名(包括格式):")

img = Image.open(name1).convert('L').resize((width,height))

plt.rcParams["image.cmap"]="gray"

ASCII_HIGH = '''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!1i;:,\"^`'. '''
txt=""

for y in range(height):
    for x in range(width):
        pos = (x,y)
        gray = img.getpixel(pos)
        index = int(gray/256*70)
        txt += ASCII_HIGH[index]+" "
    txt+="\n"

with open("处理结果.txt","w") as f:
    f.write(txt)

img_new = Image.new("RGB",(width*12,height*15),"white")
draw = ImageDraw.Draw(img_new)
draw.text((0,0),txt,fill="black")

plt.imshow(img_new)
plt.show()

上完代码我就来解释一下,

首先如果你想要运行这个程序,

需要安装Pillow库以及Matplotlib库

安装方法有两种

第一种是可以在cmd里安装(具体方法百度)

第二种是可以下载“海龟编辑器”然后在“库管理”里面安装~

我选的是第二种。

下面开始正式解析代码:

前两行是把这两个库给导入进去(plt是我定义的简称,你们可以自己自定义哦~)

然后就是这一行:

width,height=(60,60)

如果你还不太熟悉python,那么你可能看到这里是一脸懵圈,那么我就来解释一下:这一行代码大致意思就是把width变量以及height变量同时设置为60,免得还需要再写一行代码(对,Leo就是这么懒2333)

然后的那几句太简单的代码就不再讲了,有不理解的可以一起交流哦~

重点来了(敲黑板)(代码中的变量名省略了

''' $@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!1i;:,\"^`'.  '''

这一行代码就很重要了(社区显示的代码颜色有点不对,下面我来写一下)

''' $@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!1i;:,\"^`'. '''   绿色的就是三引号,三引号可以把较长的文本储存下来,方便阅读   粉色的部分就是整个程序的重点之一啦~   眼尖的训练师一定发现了:这里的字符正好是字符画里的字符!   对的,   这就是等会转字符画中间必不可少的那行代码!   少了它,将无法转成字符画!!!   这里的循环代码
for y in range(height):
    for x in range(width):
        pos = (x,y)
        gray = img.getpixel(pos)
        index = int(gray/256*70)
        txt += ASCII_HIGH[index]+" "
    txt+="\n"

就是先把图片转成灰色,然后再找到每一个像素对应的字符(刚才说的那个长字符串起到作用了吧~)

下面这里就是常规操作:

with open("处理结果.txt","w") as f:
    f.write(txt)

这行代码的实际用处是 在你保存这个py文件的路径下会生成一个字符画的txt文件,方便你向小伙伴炫耀(大雾)

(这行代码很简单就不多说了哈)

img_new = Image.new("RGB",(width*12,height*15),"white")
draw = ImageDraw.Draw(img_new)
draw.text((0,0),txt,fill="black")

这里的代码仍然是常规操作,就是创建一个画布,,然后显示(显示需要看下面的代码)我们刚才的画(但是到这里仍然仍然没有显示出来,这是因为你少加了下面的代码

plt.imshow(img_new)
plt.show()

这行代码就是显示我们刚才弄的字符画哦~)

最后,给大家发一下这个程序的py文件(蓝奏云网盘不限速,链接是它的)

https://leohan.lanzous.com/idLPtdw21ha

(链接好像是院士讲堂2333打错字了对不起哈(懒到不想修改)

本期少院士讲堂就到这里啦~

大家可以将帖子转发给别人哦~~~


回复

上一页1 页 / 共 1下一页
Leo韩Leo韩

az为什么是求助

点赞0


评论


Mellin_AmpMellin_Amp

PIL天下第一()

点赞1


评论


Leo韩Leo韩

dddddddddddddddd

点赞0


评论


Leo韩Leo韩

dddddddddddddddddddddddd

点赞0


评论


Leo韩Leo韩

dddd

点赞0


评论


Leo韩Leo韩

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

点赞0


评论


Leo韩Leo韩

顶顶顶顶顶

点赞0


评论


MC_地缚少年花子君MC_地缚少年花子君

耦合

点赞0


评论


传闻中的九黎初璃传闻中的九黎初璃

太赞!

点赞1


评论


我是曲奇饼干我是曲奇饼干

额,彩色的不香吗?!

点赞0


评论


急_开_锁_办_证810864急_开_锁_办_证810864

蛮好玩的,ASCII艺术。

点赞1


评论


碳

话说怎么三叶的脑袋在这里(疑惑

点赞0


评论


Leo韩Leo韩

加精了!!(ddddd

点赞0


评论


令狐本狐令狐本狐

喵喵喵喵喵喵喵喵喵喵喵d

点赞0


评论


禁止挖坟后果自负禁止挖坟后果自负

center_image真不错

点赞0


评论


禁止挖坟后果自负禁止挖坟后果自负

学了几个月的Python小佬的水平:

import os
from PIL import Image
import matplotlib.pyplot as plt
m='BCM'
fs=os.listdir(m)
print(fs)
ie=[".png",".jpg",".bmp",".jpeg",".gif"]
I=[]
for f in fs:
    n=os.path.splitext(f)[0]
    e=os.path.splitext(f)[-1]
    if e in ie and 'bcm' in n:
        ii=Image.open(m+os.sep+f)
        _i=ii.resize((300,300))
        I.append(_i)
#print(I)
s=[[0,1,0,1,0],
        [1,1,1,1,1],
        [1,1,1,1,1],
        [0,1,1,1,0],
        [0,0,1,0,0]]
c=5
r=5
b=Image.new('RGBA',(300*c,300*r))
for i in range(r):
    for j in range(c):
        if s[i][j]==1:
            iii=j+c*i
            b.paste(I[iii%len(I)],(j*300,i*300))
#plt.imshow(b)
#plt.show()
b.save('heart.png')

效果:center_image大佬觉得呢

点赞1


评论


時分時分

#是3d游戏哦 from ursina import * from ursina.prefabs.\ first_person_controller \ import FirstPersonController
app = Ursina() Sky(texture='sky_sunset') player = FirstPersonController()

boxes = [] for n in range(30): for k inrange(30): box = Button( color=color.blue, model='cube', position=(k, 0, n), texture='assets\grass', parent=scene, origin_y=0.5, ) boxes.append(box)
definput(key): for box in boxes: if box.hovered: if key == 'left mouse down': new = Button( color=color.red, model='cube', position=box.position + mouse.normal, texture='assets\grass', parent=scene, origin_y=0.5, ) boxes.append(new) if key == 'right mouse down': boxes.remove(box) destroy(box)
sword = Entity( model='blade', texture='assets\sword', rotation=(30, -40), position=(0.5, -0.6), parent=camera.ui, scale=(0.2, 0.15) )
def update(): if held_keys['left mouse']: sword.position = (0.4, -0.5) elif held_keys['right mouse']: sword.position = (0.4, -0.5) else: sword.position = (0.5, -0.6)
app.run()

点赞0


评论


谛霖谛霖

为什么我运行不了

点赞0


评论


谛霖谛霖

图片打不开

点赞0


评论


飞熊jSrt飞熊jSrt

不对,编程课里不是讲过吗,为什么还讲一边

点赞0


评论