曾经在网上看到有人把照片转换成字符组成的画,感觉很牛。现在在学完python后,期望自己尝试一下。
首先要了解三原色与灰度值的概念
图片是由无数像素点组成的那么,我们可以将像图片分为x,y轴组成的区间,每一个像素点就是一个坐标点。再把像素点按照其灰度值进行对应的映射不就可以了吗?
首先要先安装一个第三方的库:pillow
先来试验一下这个库的方法:
from PIL import Image, ImageFilter
# 缩放
im = Image.open('66.jpg')
获得图片大小
w,h = im.size
im.thumbnail((w//2, h//2))
im.save('56.jpg','jpeg')
模糊滤镜
im2 = Image.open('56.jpg')
im3 = im2.filter(ImageFilter.BLUR)
im3.save('566.jpg','jpeg')
进行了以上实验之后,我们开始进入正题。废话不多说,直接上代码:
from PIL import Image
str1 = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. '''
count = len(str1)
print(count)
# 步骤:先将彩色图片转换为黑白图片,然后直接将每个像素点的灰度值与字符集进行映射
def bianhuan(image_file):
image_file = image_file.convert('L') # 先将图片黑白化
codePic = ''
for h in range(0, image_file.size[1]):
for w in range(0, image_file.size[0]):
gray = image_file.getpixel((w,h)) # 遍历图片所有坐标点
print(gray)
codePic = codePic + str1[int(((count)*gray)/256)] # 得到图片坐标点的对应灰度值,并与字符集映射
codePic = codePic + '\r\n'
return codePic
fp = open(u'123.jpg','rb')
image_file = Image.open(fp)
image_file = image_file.resize((int(image_file.size[0]*0.5),int(image_file.size[1]*0.25))) # 调节图片大小
temp = open('saonian.txt','w')
temp.write(bianhuan(image_file))
temp.close()
效果图: