文档章节

Image to ascii——又一个轮子

yyliu
 yyliu
发布于 2013/02/25 12:20
字数 492
阅读 113
收藏 0

直接上代码和两个demo,本来想把html直接粘这里结果完全乱掉了:

https://github.com/reverland/scripts/blob/master/python/i2a.py


#! /bin/env python
# -*- coding: utf-8 -*-

"""
Turn images into acsii.
"""

__author__ = 'Reverland (lhtlyy@gmail.com)'

import Image
import ImageOps
import sys


filename = 'a.jpg'


def makeHTMLbox(body, fontsize, imagesize):
    """takes one long string of words and a width(px) then put them in an HTML box"""
    boxStr = """<div style=\"font-size: %spx;line-height: 100%s; width: %s;background-color: rgb(0, 0, 0);border: 1px grey solid;text-align: center; overflow: hidden;\">%s</div>
    """
    return boxStr % (fontsize, '%', imagesize[0], body)


def makeHTMLascii(body, color):
    """take words and , and create an HTML word """
    #num = str(random.randint(0,255))
    # return random color for every tags
    color = 'rgb(%s, %s, %s)' % color
    # get the html data
    wordStr = '<span style=\"color:%s;float:left;\">%s</span>'
    return wordStr % (color, body)


def i2m(im, fontsize):
    """turn an image into ascii like matrix"""
    im = im.convert('L')
    im = ImageOps.autocontrast(im)
    im.thumbnail((im.size[0] / fontsize, im.size[1] / fontsize))
    string = ''
    colors = [(0, i, 0) for i in range(0, 256, 17)]
    words = '据说只有到了十五字才会有经验的'
    for y in range(im.size[1]):
        for x in range(im.size[0]):
            p = im.getpixel((x, y))
            i = 14
            while i >= 0:
                if p >= i * 17:
                    s = makeHTMLascii(words[3 * i:3 * (i + 1)], colors[i])
                    break
                i -= 1
            if x % im.size[0] == 0 and y > 0:
                s = s + '<br/>'
            string = string + s
    return string


def i2a(im, fontsize):
    """turn an image into ascii with colors"""
    im = im.convert('RGB')
    im = ImageOps.autocontrast(im)
    im.thumbnail((im.size[0] / fontsize, im.size[1] / fontsize))
    string = ''
    for y in range(im.size[1]):
        for x in range(im.size[0]):
            c = im.getpixel((x, y))
            # print c
            s = makeHTMLascii('翻', c)
            if x % im.size[0] == 0 and y > 0:
                s = s + '<br/>'
            string = string + s
    return string


def getHTMLascii(filename, fontsize, style='matrix', outputfile='a.html', scale=1):
    """Got html ascii image"""
    im = Image.open(filename)
    size = (int(im.size[0] * scale), int(im.size[1] * scale))
    im.thumbnail(size, Image.ANTIALIAS)
    if style == 'matrix':
        ascii = makeHTMLbox(i2m(im, fontsize), fontsize, im.size)
    elif style == 'ascii':
        ascii = makeHTMLbox(i2a(im, fontsize), fontsize, im.size)
    else:
        print "Just support ascii and matrix now, fall back to matrix"
        ascii = makeHTMLbox(i2m(im, fontsize), fontsize, im.size)
    with open(outputfile, 'wb') as f:
        f.write(ascii)
    return 1


if __name__ == '__main__':
    if sys.argv[1] == '--help' or sys.argv[1] == '-h':
        print """Usage:python i2a.py filename fontsize [optional-parameter]
        optional-parameter:
            scale -- between (0, 1)
            style -- matrix or ascii"""
    else:
        filename = sys.argv[1]
        try:
            fontsize = int(sys.argv[2])
        except:
            fontsize = int(raw_input('input fontsize please:'))
        try:
            scale = float(sys.argv[3])
        except:
            scale = 1
        try:
            style = sys.argv[4]
        except:
            style = 'matrix'
        getHTMLascii(filename, fontsize, scale=scale, style=style)

demo1 黑客帝国风格

http://reverland.org/matrix_demo.html

demo2 经典风格

http://reverland.org/ascii_demo.html

© 著作权归作者所有

共有 人打赏支持
上一篇: 细节是魔鬼
yyliu
粉丝 31
博文 14
码字总数 20045
作品 0
无锡
私信 提问
为什么我们做了一个又一个轮子?

为什么又一个轮子,这明显有是一个重复的轮子嘛,我们是群居动物,我们天生藐视其他人,我们是程序猿

sidney9111
2015/03/16
3K
25
fir.im Weekly - iOS 开发中的 Git 流程

本期 fir.im Weekly 收集了微博上的热转资源,包含 Android、iOS 开发工具、源码等好用的轮子,还有一些 APP 设计的 Tips,希望对你有用。 精仿知乎日报 iOS 端 @我偏笑_NSNirvana花了将近一...

风起云飞fir_im
2015/11/03
0
0
「造个轮子」——cicada(轻量级 WEB 框架)

前言 俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围。 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式。 好了,现在着重来谈谈 cica...

crossoverJie
2018/09/03
0
0
通过人眼识别的帧数来理解采样频率

人眼识别的帧数 1.1 问 人眼能识别的帧数最高是多少? 就是超过多少帧就感觉不出画面是有间隔的。有人说24帧,有人说30帧,求准确的解答。 1.2 答 你的提问其实是两个问题,提问一个,内容又...

天蚕宝衣
2017/04/14
39
0
回答在职前端的疑问:平时工作是主抓业务还是主抓技术?

这个问题应该是一年到三年前端比较容易遇到的问题: 现在越来越觉的写业务代码无趣了,感觉就是一个搬运工。技术栈主要是 vue + elementUI / react 。 前端工作已经有一年半多的时间了。我今...

方应杭在饥人谷
2018/06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android Messenger进程间客户端向服务端传递数据

Messenger:客户端向服务端传递数据 1.Service: public class MessengerService extends Service { private Messenger messenger = new Messenger(new Handler() { public void handleMess......

Coding缘
21分钟前
2
0
Pod在多可用区worker节点上的高可用部署

一、 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布在同一个可用...

zhaowei121
39分钟前
3
0
oracle XTTS介绍

一、什么是XTTS 首先什么是XTTS。XTTS其实是从TTS来的,TTS其实也是传输数据的一种手段,传输数据的时候可能用过EXP的方式,再往后可能用数据泵导入导出一些数据,或者去做备份然后再恢复。其...

突突突酱
40分钟前
1
0
[缺陷分析]半同步下多从库复制异常

引 言 本文是由爱可生研发团队出品的「图解MySQL」系列文章,不定期更新,但篇篇精品。 爱可生开源社区持续运营维护的小目标: 每周至少推送一篇高质量技术文章 每月研发团队发布开源组件新版...

爱可生
40分钟前
2
0
二维数组序号重置

public static function unique_arr($array2D,$stkeep=false,$ndformat=true){ // 判断是否保留一级数组键 (一级数组键可以为非数字) if($stkeep) $stArr = array_keys($array2D); // 判断是......

dragon_tech
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部