基于egret的抖音上的ASCII码视频或图片

15 篇文章 1 订阅
14 篇文章 0 订阅

以前写过C版的,看到最近抖音有个ASCII码视频,想想可以这么处理。不废话了,扔代码如下:

        let img = this.createBitmapByName("egret_icon_png");
        img.visible = false;
        this.addChild(img);
        let stageW = this.stage.stageWidth;
        let stageH = this.stage.stageHeight;

        let _fontSize: number = 20;
        let _chars: string = this.toChars(img, Math.floor(stageW / _fontSize));

        let _label: eui.Label = new eui.Label();
        _label.size = _fontSize;
        _label.text = _chars;
        // _label.fontFamily="SimHei";
        _label.lineSpacing = 0;
        _label.textAlign = "center";
        // _label.horizontalCenter = 0;
        // _label.verticalCenter = 0;
        this.addChild(_label);

上面调用的相关方法如下:

private toChars(img: egret.Bitmap, rowChars: number) {
        let map = this.getCharsMap();

        rowChars = img.width < rowChars ? img.width : rowChars;
        let char_h = img.width / rowChars;
        let char_w = char_h;
        let rows = img.height / char_h;
        let cols = rowChars;

        let _rgb: number[] = img.texture.getPixels(0, 0, img.width, img.height);
        function getBlockGray(x, y, w, h) {
            let sumGray = 0;
            let pixels = 0;
            for (let row = 0; row < w; row++) {
                for (let col = 0; col < h; col++) {
                    let cx = x + col; //current position x                        
                    let cy = y + row; //current positon y                        
                    let index = (cy * img.width + cx) * 4; //current index in rgba data array                        
                    let data = _rgb;
                    let R = data[index + 1];
                    let G = data[index + 2];
                    let B = data[index + 3];
                    let gray = ~~(R * 0.3 + G * 0.59 + B * 0.11);
                    sumGray += gray;
                }
            }
            pixels = w * h;
            return ~~(sumGray / pixels);
        }

        let output = "";
        for (let r = 0; r < rows; r++) {
            for (let c = 0; c < cols; c++) {
                let pos_x = ~~(c * char_h);
                let pos_y = ~~(r * char_h);
                let avg = getBlockGray(pos_x, pos_y, ~~char_w, ~~char_h);
                let ch = map[avg];
                output += ch;
            }
            output += '\r\n';
        };
        return output;
    }
    private getCharsMap() {
        // let chars = [' ', '`', '.', '^', ',', ':', '~', '"', '<', '!', 'c', 't', '+', '{', 'i', '7', '?',
        //     'u', '3', '0', 'p', 'w', '4', 'A', '8', 'D', 'X', '%', '#', 'H', 'W', 'M',
        //     0, 5, 7, 9, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43,
        //     45, 47, 49, 51, 53, 55, 59, 61, 63, 66, 68, 70];
        // chars.reverse();
        let chars = ['@', ' w ', ' # ', ' $ ', ' k ', ' d ', ' t ', ' j ', ' i ', ' . ', '   '];
        let step = 25;
        let map = {};
        for (let i = 0; i < 256; i++) {
            let index = ~~(i / 25)
            map[i] = chars[index];
        };
        return map;
    }

以白鹭官方logo图为例,结果如下:

原图:  ----->>>运行后:  

至于视频或者摄像成ASCII码的话,应该是开启手机相机权限,获取相机视频数据,按照一定帧率获取视频像素点数据,类似截屏,然后一张张解析成ASCII码的图片,最后类似放电影一样一张张轮播显示屏幕上就成视频啦。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值