• python字符画生成的原理及其简单,一句话概括就是----将图片像素点用不同字符代替,从而将像素组成的图片转变成用字符组成的字符画。为了尽可能的使得字符画展示效果与图片相同。灰度值高的像素我们使用视觉上较深的...

    手把手教你用python将图片做成字符画!

    字符画效果图,聪明的你肯定猜到原图是什么了

    python字符画是一个简单有趣的小程序,非常适合初学者进行学(zhuang)习(bi)。python字符画生成的原理及其简单,一句话概括就是----将图片像素点用不同字符代替,从而将像素组成的图片转变成用字符组成的字符画。为了尽可能的使得字符画展示效果与图片相同。灰度值高的像素我们使用视觉上较深的字符表示(如$),灰度值较低的像素我们使用视觉上较浅的字符表示(如.)

    字符视觉排列

    我们选择一些字符,从视觉上的深浅将他们人工排序。

    手把手教你用python将图片做成字符画!

    字符视觉排序

    我们可以看到list中左边的字符视觉上较深,右边的字符视觉上较浅。

    在这里我还是要推荐下我自己建的Python开发学习群:589306326,都是学Python开发的,如果你正在学习Python ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2017最新的Python零基础资料和Python进阶教程,欢迎进加入

    打开图片,调整大小

    打开我们需要转化的图片,并将图片调整为我们所指定的宽和高(字符画的宽和高)

    手把手教你用python将图片做成字符画!

    我们使用PIL来进行图片操作

    使用PIL模块的open方法打开一张图片,使用resize方法将图片调整到宽为WIDTH,高为HEIGHT的大小。

    像素转化为字符

    定义一个方法get_char,这个方法输入一个像素点的r,b,g然后输出对应的字符。

    手把手教你用python将图片做成字符画!

    get_char方法

    方法中使用int(0.2126*r+0.7152*g+0.0722*b)将r,b,g转化为灰度值,然后根据灰度值的大小确定所选字符在ascii_char中的位置。

    我们只需要遍历图片中的每一个像素,依次调用get_char方法即可得到每一个像素对应的字符,然后将这些字符组合起来即可得到所需的字符画了。

    全部源码如下:

    手把手教你用python将图片做成字符画!

    全部源码

    欢迎大家留言讨论!

    展开全文
  • 1. 前言以前一直觉得字符画非常牛逼,却又不知道怎么做...Python 图片字符画2. 记录2.1 实现代码# coding:utf-8 from PIL import Image import argparse#命令行输入参数处理 parser = argparse.ArgumentParser()pars

    1. 前言

    以前一直觉得字符画非常牛逼,却又不知道怎么做, 今天正好看到实验楼上有这么一个实验介绍这个的做法, 虽然非常简单, 不过还是蛮好玩的呢
    Python 图片转字符画

    2. 记录

    2.1 实现代码

    # coding:utf-8
    from PIL import Image
    import argparse
    
    #命令行输入参数处理
    parser = argparse.ArgumentParser()
    
    parser.add_argument('file')     #输入文件
    parser.add_argument('-o', '--output')   #输出文件
    parser.add_argument('--width', type = int, default = 80) #输出字符画宽
    parser.add_argument('--height', type = int, default = 80) #输出字符画高
    
    #获取参数
    args = parser.parse_args()
    
    IMG = args.file
    WIDTH = args.width
    HEIGHT = args.height
    OUTPUT = args.output
    
    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
    
    # 将256灰度映射到70个字符上
    def get_char(r,g,b,alpha = 256):
        if alpha == 0:
            return ' '
        length = len(ascii_char)
        gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    
        unit = (256.0 + 1)/length
        return ascii_char[int(gray/unit)]
    
    if __name__ == '__main__':
    
        im = Image.open(IMG)
        im = im.resize((WIDTH,HEIGHT), Image.NEAREST)
    
        txt = ""
    
        for i in range(HEIGHT):
            for j in range(WIDTH):
                txt += get_char(*im.getpixel((j,i)))
            txt += '\n'
    
        print(txt)
    
        #字符画输出到文件
        if OUTPUT:
            with open(OUTPUT,'w') as f:
                f.write(txt)
        else:
            with open("output.txt",'w') as f:
                f.write(txt)
    

    2.2 代码分析

    这个代码实际上非常简单, 主要是分为下面 3 个部分:
    1. 通过argparse 模块对输入的命令行参数进行解析, 获取文件名, 图片高度, 图片宽度, 输出目录等信息。 相关的参考文档: https://docs.python.org/2/howto/argparse.html#id1
    2. 对图片进行缩放(邻域插值), 并对每个像素点的 RGB 信息进行转化, 投影到 0 ~ 70 的区间范围上
    3. 结果输出到文件, 显示
    4. 上面代码段中有一段 txt += get_char(*im.getpixel((j,i))) 这段代码可能有些疑问。这里解释一下:

    返回的是一个元组,这个元组有三个元素,分别对应三个颜色通道(RGB)的值。
    * 是一个运算符,对元组使用 * 运算符即为元组拆封操作。元组拆封会返回元祖的所有元素。
    所以表达式 *im.getpixel((j,i)) 返回 3 个值,正好对应 get_char() 函数的三个参数。

    3. 运行效果

    盗用苹果的一副图
    这里写图片描述
    这里写图片描述

    展开全文
  • 初学Python,在网上看到Python图片字符画教程,我也来尝试下。 首先我们要用到Python的PIL库的Image模块,PIL(Python Imaging Library)库是Python的一个图像处理库。想了解PIL的详细功能介绍,可参考PIL的官方...

    初学Python,在网上看到Python图片转字符画的教程,我也来尝试下。
    首先我们要用到Python的PIL库的Image模块,PIL(Python Imaging Library)库是Python的一个图像处理库。想了解PIL的详细功能介绍,可参考PIL的官方文档(虽然我也没看过,不过还是贴上来):http://effbot.org/imagingbook/

    图片转字符画的关键思想是将图片的灰度值与你自己设定的字符集之间建立映射关系,不同区间的灰度值对应不同的字符,之后将图片每一个像素对应的字符打印出来就是我们要的字符画啦~
    这里提供两种方法:

    1. 先将彩色图片转换为黑白图片,然后直接将每个像素点的灰度值与字符集建立映射。
    2. 获取图片的RGB值,利用公式:
      Gray = R*0.299 + G*0.587 + B*0.114
      计算可得每个像素点的灰度值,之后再建立映射即可。
    # -*- coding: utf-8 -*-
    from PIL import Image
    
    codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''#生成字符画所需的字符集
    count = len(codeLib)
    
    def transform1(image_file):
        image_file = image_file.convert("L")#转换为黑白图片,参数"L"表示黑白模式
        codePic = ''
        for h in range(0,image_file.size[1]):  #size属性表示图片的分辨率,'0'为横向大小,'1'为纵向
            for w in range(0,image_file.size[0]):
                gray = image_file.getpixel((w,h)) #返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组
                codePic = codePic + codeLib[int(((count-1)*gray)/256)]#建立灰度与字符集的映射
            codePic = codePic+'\r\n'
        return codePic
    
    def transform2(image_file):
        codePic = ''
        for h in range(0,image_file.size[1]):
            for w in range(0,image_file.size[0]):
                g,r,b = image_file.getpixel((w,h))
                gray = int(r* 0.299+g* 0.587+b* 0.114)
                codePic = codePic + codeLib[int(((count-1)*gray)/256)]
            codePic = codePic+'\r\n'
        return codePic
    
    
    fp = open(u'暴走.jpg','rb')
    image_file = Image.open(fp)
    image_file=image_file.resize((int(image_file.size[0]*0.75), int(image_file.size[1]*0.5)))#调整图片大小
    print u'Info:',image_file.size[0],' ',image_file.size[1],' ',count
    
    tmp = open('tmp.txt','w')
    tmp.write(transform1(image_file))
    tmp.close()

    原图
    这里写图片描述

    转换为字符画(注:在记事本打开时记得取消自动换行,下图字体:宋体 字号:小六)
    这里写图片描述

    展开全文
  • Python 图片字符画 学习笔记标签(空格分隔): Python声明:此文章和所有代码是学习笔记,非原创,原文教程地址:https://www.shiyanlou.com/courses/370/labs/1191/document实验楼我感觉挺好的,但为了保存自己...

    Python 图片转字符画 学习笔记

    标签(空格分隔): Python


    声明:此文章和所有代码是学习笔记,非原创,原文教程地址:https://www.shiyanlou.com/courses/370/labs/1191/document

    实验楼我感觉挺好的,但为了保存自己的代码,我是在自己本地电脑敲的代码,并且改造了一下。

    这个教程是说如何把一个图片转化为字符画。

    此处输入图片的描述
    这里写图片描述

    可以直接运行的代码如下:

    from PIL import Image
    
    IMG = "ascii_dora.png"
    WIDTH = 80
    HEIGHT = 80
    
    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
    
    
    def get_char(r, g, b, alpha=256):
        if alpha == 0:
            return ' '
        length = len(ascii_char)
        gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    
        unit = (256.0 + 1) / length
        return ascii_char[int(gray / unit)]
    
    
    im = Image.open(IMG)
    im = im.resize((WIDTH, HEIGHT), Image.NEAREST)
    
    txt = ""
    
    for i in range(HEIGHT):
        for j in range(WIDTH):
            txt += get_char(*im.getpixel((j, i)))
        txt += '\n'
    
    with open("output.txt", 'w') as f:
        f.write(txt)
    

    真简短。

    展开全文
  • 字符画-Python

    2018-11-28 17:07:55
    图片转化为字符画 按顺序播放字符画 一、准备 模块 opencv-python # 用来读取视频和图片 numpy # opencv-python 依赖于它 首先安装依赖: pip3 install numpy opencv-python 然后新建python代码文档,在开头添加...

    视频转字符动画-Python

    # bad apple

    步骤
    将视频转化为一帧一帧的图片
    把图片转化为字符画
    按顺序播放字符画

    一、准备

    1. 模块
      opencv-python # 用来读取视频和图片
      numpy # opencv-python 依赖于它

    首先安装依赖:
    pip3 install numpy opencv-python

    然后新建python代码文档,在开头添加上下面的导入语句
    import numpy as np

    1. 材料文件
      材料就是视频文件了,我这里用的是在百度网盘提取的BadApple.mp4,
      记得下载下来和python代码放到同一目录下

    二、按帧读取视频

    现在继续添加代码,实现第一步:按帧读取视频。
    下面这个函数,接受视频路径和字符视频的尺寸信息,返回一个img列表,其中的img是尺寸都为指定大小的灰度图。
    #导入 opencv

    import cv2
    def video2imgs(video_name, size):
    
    img_list = []
    
    # 从指定文件创建一个VideoCapture对象
    cap = cv2.VideoCapture(video_name)
    
    # 如果cap对象已经初始化完成了,就返回true,换句话说这是一个 while true 循环
    while cap.isOpened():
        # cap.read() 返回值介绍:
        #   ret 表示是否读取到图像
        #   frame 为图像矩阵,类型为 numpy.ndarry.
        ret, frame = cap.read()
        if ret:
            # 转换成灰度图,也可不做这一步,转换成彩色字符视频。
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
            # resize 图片,保证图片转换成字符画后,能完整地在命令行中显示。
            img = cv2.resize(gray, size, interpolation=cv2.INTER_AREA)
    
            # 分帧保存转换结果
            img_list.append(img)
        else:
            break
    
    # 结束时要释放空间
    cap.release()
    
    return img_list
    

    三、图像转化为字符画

    视频转换成了图像,这一步便是把图像转换成字符画
    下面这个函数,接受一个img对象为参数,返回对应的字符画。

    用于生成字符画的像素,越往后视觉上越明显。。这是我自己按感觉排的,你可以随意调整。
    pixels = " .,-'`:!1+*abcdefghijklmnopqrstuvwxyz<>()\/{}[]?234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ%&@#$"
    
    def img2chars(img):
    res = []
    """
    
    :param img: numpy.ndarray, 图像矩阵
    :return: 字符串的列表:图像对应的字符画,其每一行对应图像的一行像素
    """
    
    # 要注意这里的顺序和 之前的 size 刚好相反
    height, width = img.shape
    for row in range(height):
        line = ""
        for col in range(width):
            # 灰度是用8位表示的,最大值为255。
            # 这里将灰度转换到0-1之间
            percent = img[row][col] / 255
            
            # 将灰度值进一步转换到 0 到 (len(pixels) - 1) 之间,这样就和 pixels 里的字符对应起来了
            index = int(percent * (len(pixels) - 1))
    
            # 添加字符像素(最后面加一个空格,是因为命令行有行距却没几乎有字符间距,用空格当间距)
            line += pixels[index] + " "
        res.append(line)
    
    return res
    

    上面的函数只接受一帧为参数,一次只转换一帧,可我们需要的是转换所有的帧,所以就再把它包装一下:

    def imgs2chars(imgs):
        video_chars = []
        for img in imgs:
            video_chars.append(img2chars(img))
    
        return video_chars
    

    四、播放字符视频

    把它封装成了一个函数。下面这个函数接受一个字符画的列表并播放。
    import time
    import subprocess

    def play_video(video_chars):
        """
        播放字符视频
        :param video_chars: 字符画的列表,每个元素为一帧
        :return: None
        """
        # 获取字符画的尺寸
        width, height = len(video_chars[0][0]), len(video_chars[0])
    
    for pic_i in range(len(video_chars)):
        # 显示 pic_i,即第i帧字符画
        for line_i in range(height):
            # 将pic_i的第i行写入第i列。
            print(video_chars[pic_i][line_i])
        time.sleep(1 / 24)  # 粗略地控制播放速度。
    
        subprocess.call("clear")  # 调用shell命令清屏
    

    写完后,开个shell,最大化窗口,然后找到代码文件(文件名换成你的)
    python3 fx.py
    可能要等很久。我使用1080p视频大概需要2分钟左右。
    看到提示的时候,按回车,开始播放!

    完整代码如下

    import numpy as np
    
    import cv2
    
    def video2imgs(video_name, size):
    
    img_list = []
    
    cap = cv2.VideoCapture(video_name)
    
    while cap.isOpened():
    
        ret, frame = cap.read()
        if ret:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            img = cv2.resize(gray, size, interpolation=cv2.INTER_AREA)
            img_list.append(img)
        else:
            break
    cap.release()
    return img_list
    
    pixels = " .,-'`:!1+*abcdefghijklmnopqrstuvwxyz<>()\/{}[]?234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ%&@#$"
    
    
    def img2chars(img):
        res = []
        height, width = img.shape
        for row in range(height):
            line = ""
            for col in range(width):
                percent = img[row][col] / 255
                index = int(percent * (len(pixels) - 1))
                line += pixels[index] + " "
            res.append(line)
        return res
    
    def imgs2chars(imgs):
        video_chars = []
        for img in imgs:
            video_chars.append(img2chars(img))
    
        return video_chars
    
    import time
    import subprocess
    
    def play_video(video_chars):
    
        width, height = len(video_chars[0][0]), len(video_chars[0])
        for pic_i in range(len(video_chars)):
            for line_i in range(height):
                print(video_chars[pic_i][line_i])
            time.sleep(1 / 24)
            subprocess.call("clear") 
    
    if __name__ == "__main__":
        imgs = video2imgs("Bad Apple.mp4", (64, 48))
        video_chars = imgs2chars(imgs)
        input("`转换完成!按enter键开始播放")
        play_video(video_chars)
    

    注意在shell窗口运行

    在这里插入图片描述

    展开全文
  • 点击上方“程序人生”,选择“置顶公众号”第一时间关注程序猿(媛)身边的故事作者码农如需转载,请联系原作者授权。今天给大家介绍一个 Python 的骚操作,将图片转化为字符...
  • Python--图片字符画

    2018-04-08 23:56:12
    2018年4月8日17:30PS:嗯,作为初学python的第一个练手项目,有一些教程是在Linux下搭建实现的而且有一些还是用的python2实现的,之间也是遇到了一些大大小小的问题。麻雀虽小,五脏俱全,所以就写个教程做心得抑或...
  • 原文链接:https://github.com/grzhan/badapple_ascii_anime/blob/master/bad_apple_ascii_vcommment.py 参考资源:http://qinxuye.me/article/implement-sketch-and-pencil-with-pil/ .../usr/bin/env python
  • Python图片字符画

    2018-09-27 16:16:34
    Python图片字符画 参考资料来自Python 图片字符画 倒入第三方库 个人采用的IDE是PyCharm CE,这里简单的记录下倒入第三方库的办法 点击’+‘号,来添加我们的第三方库’Pillow’ Pillow 一个用来处理与图片...
  • 代码执行: 我的源文件夹名和生成后文件夹名,badapple中是一张张图片,badapple_char中是生成的一张张...这篇文章需结合我的第一篇文章 python图片字符画(https://blog.csdn.net/qq_41661918/article/details/...
  • 思路逐行扫描图片的像素点 获取RGB参数 转换为灰度值 根据灰度值 转换为字符 需要用到的库PIL的image模块 命令行解析库 argparse先完成get_ascii的操作,即将RGB值转换为灰度值再根据获取到的灰度值取得字符列表中...
  • 实验网址:Python 图片字符画 - 实验楼 Python 图片字符画 一、实验介绍 本实验用 50 行 Python 代码完成图片字符画小工具。通过本实验将学习到 Linux 命令行操作,Python 基础,pillow 库的使用,argparse...
  • Python 图片字符画

    2019-01-05 15:29:43
    Python 图片字符画 一、课程介绍 1. 课程来源 原创 2. 内容简介 本课程讲述怎样使用 Python图片转为字符画 3. 前置课程 Python编程语言 Linux 基础入门(新版) Vim编辑器 4. 课程知识点 本节实验中我们将实践...
  • python-图片字符画

    2018-05-05 10:54:48
    from PIL import Image import argparse #使用argparse的第一步就是创建一个解析器对象,并告诉它将会有些什么参数。那么当你的程序运行时,该解析器就可以用于处理命令行参数。 parser = argparse.ArgumentParser()...
  • 本文尝试用python的PIL库将图片转换为字符画
  • python 图片字符画

    2019-08-10 18:43:04
    python 图片字符画 项目介绍 本实验用 50 行 Python 代码完成图片字符画小工具。通过本实验将学习到 Linux 命令行操作,Python 基础,pillow 库的使用,argparse 库的使用。 项目知识点 linux 命令操作 ...
  • #coding=utf8 import Image import argparse #命令行输入参数处理 #parser = argparse.ArgumentParser() #parser.add_argument('file') #输入文件 #parser.add_argument('-o', '--output') #输出文件 ...
  • Python学习 - Python 图片字符画 来源: https://www.shiyanlou.com/courses/370 原理 pillow 是python的图形处理库 argparse 库是用来管理命令行参数输入的 利用灰度公式 gray = 0.2126 * r + 0.7152 * ...
  • 在上次的教程中,我们只是将图像转换...接下来我便教大家如何将图像转换字符画的时候,同时具有颜色,输出一幅带色彩的字符画。 以下是具体代码: #-*- coding:utf-8 -*- import os from PIL import Image, Ima...
1 2 3 4 5 ... 20
收藏数 3,786
精华内容 1,514