プログラムで画像を変更して、詳細をテキストに置き換えますか?
-
03-07-2019 - |
質問
次の効果をプログラムでどのように再現しますか?
(ソース: artext.co.uk )
可能な場合はプロセスを自動化したいが、出力を制御する(IE、カラーパレットを反転して暗い画像の背景を明るくするなど)。可能であれば、ベクター形式で結果を生成することも素晴らしいでしょう。
更新: ASCIIアートで単に再作成するのではなく、画像の再作成に使用される文字列も指定したいと思います。
解決
非常に簡単です。画像をグリッドで分割し、各グリッドセルで見つかったピクセルの平均色(または明度や色相など)を計算し、同じサイズの画像を作成し、グリッドに対応する文字を描画します見つかった色のセル。
他のヒント
少し気が狂っていましたが、ついにアルゴリズムを示すために処理のスケッチを少しハッキングしました。
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);
}
}
}
太字(太字)のモノスペースフォントでより適切に動作するはずです。
mplayerにはこれに対処する2つのドライバーがあります。1つは「libaa」と呼ばれるBWです。 / ascii-art、その他の「libcaca」:
ソースは両方で利用できますが、どのライセンスで使用したか覚えていません。
動作中の両方のライブラリのスクリーンショットについては、これを参照してください。 http://liquidweather.net/howto/index.php?id=74
PhiLhoの答えよりもさらに簡単です。黒い背景に白いすべての同じサイズの画像にテキストをレンダリングし(必要に応じて事前に生成できます)、この「テキストマスク」を掛けます。ソース画像を含む画像。文字サイズよりも小さい詳細を表示したくない場合は、半径がテキストサイズに匹敵するガウスぼかしでソースイメージをぼかします。