2

次の効果をプログラムでどのように再現しますか? (出典: artext.co.uk )


可能であればプロセスを自動化したいのですが、出力をある程度制御したいと思います(IE、カラーパレットを反転して暗い画像の明るい背景を生成するなど)。可能であれば、ベクトル形式で結果を生成することも素晴らしいでしょう。

更新: ASCII アートで再作成するだけでなく、画像の再作成に使用する文字列も指定したいと思います。

4

4 に答える 4

4

それは非常に簡単です: 画像をグリッドで分割し、各グリッド セルで見つかったピクセルの平均色 (または明度や色相など) を計算し、同じサイズの画像を作成し、グリッド セルに対応する文字を色を発見。

于 2009-01-06T12:48:54.677 に答える
2

少しバタバタしていましたが、最終的に小さな処理スケッチをハッキングして、アルゴリズムを実証しました。

final int GRID_SIZE_H = 9;
final int GRID_SIZE_V = 9;
final int GRID_SIZE = GRID_SIZE_H * GRID_SIZE_V;
final String TEXT_TO_DISPLAY = "Picture yourself in a boat on a river With tangerine trees and marmalade skies";

void setup()
{
  size(600, 600);
  smooth();
  noStroke();
  background(0);

  PImage niceImage = loadImage("SomeImage.png");
  int niW  = niceImage.width;
  int niH = niceImage.height;
  int imgW = niW + 10;
  image(niceImage, 0, 0);

  PFont f = loadFont("Arial-Black-12.vlw");
  textFont(f);
  textAlign(CENTER);
  String textToDisplay = TEXT_TO_DISPLAY.toUpperCase().replaceAll("\\s", "");

  int pos = 0;
  niceImage.loadPixels();
  for (int j = 0; j < niH - GRID_SIZE_V; j += GRID_SIZE_V)
  {
    for (int i = 0; i < niW - GRID_SIZE_H; i += GRID_SIZE_H)
    {
      long avgR = 0, avgG = 0, avgB = 0;
      for (int x = 0; x < GRID_SIZE_H; x++)
      {
        for (int y = 0; y < GRID_SIZE_V; y++)
        {
          int c = niceImage.pixels[i + x + (j + y) * niW];
          avgR += (c >> 16) & 0xFF;
          avgG += (c >>  8) & 0xFF;
          avgB +=  c        & 0xFF;
        }
      }
      color clr = color(avgR / GRID_SIZE, avgG / GRID_SIZE, avgB / GRID_SIZE);
      fill(clr);
      char chr = textToDisplay.charAt(pos++);
      pos = pos % textToDisplay.length();
      text(chr, i + imgW, j + 12);
    }
  }
}

太い (太字) 等幅フォントを使用すると、より適切に機能するはずです。

于 2009-01-06T15:50:25.013 に答える
0

PhiLhoの答えよりもさらに簡単です。黒地に白一色の同じサイズの画像にテキストをレンダリングし (これは必要に応じて事前に生成することもできます)、この「テキスト マスク」画像をソース画像と掛け合わせます。文字より小さいディテールを表示したままにしたくない場合は、半径がテキスト サイズに匹敵するガウスぼかしでソース イメージをぼかします。

于 2011-09-20T19:19:51.817 に答える
0

これに対処する mplayer 用のドライバーは 2 つあります。1 つは「libaa」/ascii-art と呼ばれる BW で​​、もう 1 つは「libcaca」です。

ソースは両方で利用できますが、どのライセンスの下であるかは覚えていません。

動作中の両方のライブラリのスクリーンショットについては、これを参照してください: http://liquidweather.net/howto/index.php?id=74

于 2009-01-06T12:56:31.137 に答える