文字列のAAを自動生成 デモ + サンプルコード JavaScript

文字列のAAを自動生成 デモ + サンプルコード JavaScript

2019-01-0313 min read

目次

  1. 概要
  2. サンプル画像
  3. デモ
  4. デモ解説

概要

文字列から文字列のAA(アスキーアート)を自動生成するデモを紹介します。

サンプル画像

普通のアルファベット平仮名漢字を変換してみました。

↓実際の文字列↓ (端末・ブラウザなど、環境によっては正しく表示されません)

                                                                          0000
                                                                          0000                                  000000000000000000000000000000000000000000
                                                                          0000                                  0000      0000000000000000000000  00000000
                                                                          0000        0000000000                00        0000                      00
                                    0000                        00000000000000000000000000000000                00      0000                        00
                                    0000                        0000000000000000                                00      0000                        00
                                  00000000                                0000          0000                    00    0000      00000000000000      00
                                  00000000                                00            0000                    00    0000      0000      0000      00
                                  00000000                                0000  000000000000                    00  000000      0000        00      00
    0000000000                  0000  000000                            000000000000000000000000                00    0000      0000        00      00
  0000    000000                00    000000                        0000000000      000000  000000              00      0000    0000        00      00
0000        0000              0000      000000                    0000000000        0000      000000            00      0000    0000        00      00
0000        0000              00        000000                  000000    00      000000        0000            00        0000  0000        00      00
          000000            0000          0000                  0000      00      0000          0000            00        0000  0000      0000      00
      0000000000            00000000000000000000              0000        0000  0000              00            00        0000  00000000000000      00
  0000      0000            00            000000              0000        0000000000            0000            00        0000  0000                00
0000        0000          0000              000000            0000        00000000              0000            00000000000000  0000                00
0000        0000          00                000000            0000        000000              000000            00    0000                          00
0000        0000        0000                  000000          000000    000000              000000              00                                  00
00000000000000000000    0000                  000000            000000000000            00000000                00                                  00
  00000000  000000  0000000000            00000000000000          000000          000000000000                  00                          0000000000
                                                                                  000000                        00                          0000000000
                                                                                                                00

顔文字を変換するとこんな感じになります。

絵文字もAA化できました。

デモ

外部リンクで開く

デモ解説

ソース

HTML

<div class="markdown-body">
    <canvas id="canvas" width="200" height=30>
	図形を表示するには、canvasタグをサポートしたブラウザが必要です。
	</canvas>
    <input type="text" id="text">
    <input type="button" id=main value="RUN">
    <pre id="result">
    </pre>
</div>

JavaScript

function main() {
  var canvas = document.getElementById('canvas');
  if (!canvas.getContext) {
    return;
  }
  var context = canvas.getContext('2d');
  var text = document.getElementById('text').value;

  var charSize = 25;
  canvas.width = charSize * text.length;
  canvas.height = charSize + 2;
  context.font = '25px \'Times New Roman\'';
  initCanvas();
  context.fillText(text, 0, 25);
  canvas2aa();
}

function initCanvas() {
  var canvas = document.getElementById('canvas');
  if (!canvas.getContext) {
    return -1;
  }
  var context = canvas.getContext('2d');

  var dst = context.createImageData(canvas.width, canvas.height);

  for (var i = 0; i < dst.data.length; i++) {
    dst.data[i] = 255;
  }
  context.putImageData(dst, 0, 0);
}

function canvas2aa() {
  document.getElementById('result').innerHTML = '';
  var canvas = document.getElementById('canvas');
  if (!canvas.getContext) {
    return -1;
  }

  var context = canvas.getContext('2d');
  var src = context.getImageData(0, 0, canvas.width, canvas.height);
  var dst = context.createImageData(canvas.width, canvas.height);

  for (var i = 0; i < src.data.length; i = i + 4) {
    var x = (src.data[i] + src.data[i + 1] + src.data[i + 2]) / 3;
    dst.data[i] = x;
    dst.data[i + 1] = x;
    dst.data[i + 2] = x;
    dst.data[i + 3] = src.data[i + 3];

    var text = '';
    if (x <= 127) {
      text = '00';
    } else {
      text = '  ';
    }

    if (i / 4 % canvas.width === 0) {
      text = '\n';
    }
    document.getElementById('result').innerHTML += text;
  }
  context.putImageData(dst, 0, 0);
}

document.getElementById('main').onclick = function() {
  main();
};

解説

任意の文字列をcanvasに描画した後、canvasのピクセルデータ(imageData)を走査します。

この時、2値化の処理と同じように、閾値より低いものは文字を描画、そうでなければ描画しない(実際にはスペースを描画)しています。

Tags
javascript(109)
linux(54)
node.js(53)
amazon%20aws(47)
typescript(44)
%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0(36)
%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86(30)
html5(29)
php(24)
centos(24)
python(22)
%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0(21)
mac(21)
mysql(20)
canvas(19)
opencv(17)
%E9%9B%91%E8%AB%87(16)
docker(16)
wordpress(15)
atcoder(14)
apache(12)
%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92(12)
%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9(12)
amazon%20s3(12)
red%20hat(12)
prisma(12)
ubuntu(11)
github(10)
git(10)
vue.js(10)
%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF(10)
mariadb(10)
react(9)
aws%20cdk(9)
css3(8)
%E5%8F%AF%E8%A6%96%E5%8C%96(8)
%E5%B0%8F%E3%83%8D%E3%82%BF(8)
nestjs(8)
amazon%20lightsail(7)
next.js(7)
%E3%83%96%E3%83%AD%E3%82%B0(6)
cms(6)
oracle(6)
perl(6)
gitlab(6)
iam(5)
amazon%20ec2(5)
%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93(5)
aws%20amplify(5)
curl(4)
Author
githubzennqiita
ただの備忘録です。

※外部送信に関する公表事項