在好例子网,分享、交流、成长!
您当前所在位置:首页Python 开发实例Python语言基础 → python实现图片和视频转ASCII码

python实现图片和视频转ASCII码

Python语言基础

下载此实例
  • 开发语言:Python
  • 实例大小:3.98KB
  • 下载次数:31
  • 浏览次数:270
  • 发布时间:2020-03-12
  • 实例类别:Python语言基础
  • 发 布 人:cryengine3
  • 文件格式:.py
  • 所需积分:0
 相关标签: ASCII SCI CI 图片 视频

实例介绍

【实例简介】图片和视频转ASCII码,输出图片或视频
【实例截图】

【核心代码】

"""
python Video&Image2Text.py file_name [-color]
"""

import os
import cv2
import sys
import numpy as np
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import time

chars = '#@&%x*^,. '
color = False


def handle_one_frame(img):
    start = time.time()
    img = img.convert('L') if not color else img  # convert to gray if color is False.
    img = np.array(img)
    width = img.shape[1]
    height = img.shape[0]
    output_img = Image.new(mode = 'RGB' if color else 'L', size = (width, height),
                           color = (255, 255, 255) if color else (255,))  # use '1' rather than 'L' is more clear.
    draw = ImageDraw.Draw(output_img)  # to write text to image.
    font = ImageFont.truetype(font = 'segoeui.ttf', size = 13 if color else 9)
    # write a char in every (block_size X block_size) area, and block_size should be odd.
    block_size = 11 if color else 9
    half_block_size = int(block_size / 2)
    for i in range(half_block_size, width, block_size):
        for j in range(half_block_size, height, block_size):
            # calculate each block's total gray value.
            try:
                if not color:
                    array = [[img[x][y] for y in range(i - half_block_size, i   half_block_size   1)] for x in
                             range(j - half_block_size, j   half_block_size   1)]  # 2d array.
                    total = sum([sum(array[k]) for k in range(len(array))])
                    average_value = int(total / (block_size * block_size))  # average gray value.
                    draw.text((i, j), chars[int(average_value / 25)], font = font)
                else:
                    arrays = [
                        [[img[x][y][channel] for y in range(i - half_block_size, i   half_block_size   1)] for x in
                         range(j - half_block_size, j   half_block_size   1)] for channel in range(3)]
                    totals = [sum([sum(arrays[i][k]) for k in range(len(arrays[i]))]) for i in range(len(arrays))]
                    average_values = [int(totals[i] / (block_size * block_size)) for i in range(len(totals))]
                    draw.text((i, j), chars[int(sum(average_values) / (25 * 3))], font = font,
                              fill = (average_values[0], average_values[1], average_values[2]))
            except:
                continue
    end = time.time()
    print('cost: ', end - start, 's')
    return output_img


def main(file):
    if str(os.path.splitext(file)[1]).lower() in ['.jpg', '.png']:
        img = Image.open(file)
        output_img = handle_one_frame(img)
        output_img.save(os.path.splitext(file)[0]   '--output.jpg')
    elif str(os.path.splitext(file)[1]).lower() in ['.mp4']:
        video = cv2.VideoCapture(file)
        state, img = video.read()
        # create VideoWriter to write video.
        fps = int(video.get(cv2.CAP_PROP_FPS))
        width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
        height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
        output_video = cv2.VideoWriter(os.path.splitext(file)[0]   '--output.avi',
                                       cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), fps, (width, height))
        count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
        while state:
            try:
                count -= 1
                state, img = video.read()
                img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # cv2 image to PIL image.
                output_img = handle_one_frame(img)
                output_img = output_img.convert('RGB')
                img = cv2.cvtColor(np.array(output_img), cv2.COLOR_RGB2BGR)  # PIL image to cv2.
                output_video.write(img)
                print(count)
            except Exception as e:
                print(e)
        output_video.release()
        video.release()


if __name__ == '__main__':
    if len(sys.argv) == 3 and sys.argv[2] == '-color':
        color = True
    main(sys.argv[1])

标签: ASCII SCI CI 图片 视频

实例下载地址

python实现图片和视频转ASCII码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警