Frage

Wie würde man programmatisch den folgenden Effekt reproduzieren?

(Quelle: artext.co.uk )

Ich möchte den Prozess, wenn möglich, automatisieren, aber eine gewisse Kontrolle über den Ausgang (IE, das Umkehren der Farbpalette einen hellen Hintergrund für dunkle Bilder zu erzeugen, usw.) haben. Produziert Ergebnisse im Vektor-Format wäre toll, wenn möglich auch.

Update: Anstatt nur mit ASCII-Kunst neu zu erstellen, würde Ich mag auch die Zeichenfolge angeben, die verwendet wird, um das Bild zu erstellen.

War es hilfreich?

Lösung

Es ist ganz einfach: das Bild mit einem Raster unterteilen, berechnen durchschnittliche Farbe (oder Helligkeit oder den Farbton, etc.) des Pixels auf jeder Rasterzelle gefunden wird, um ein Bild derselben Größe erstellen, den Brief zeichnet auf das Gitter entspricht Zelle mit der gefundenen Farbe.

Andere Tipps

Ich war ein wenig buzzy, aber ich gehackt endlich ein wenig Verarbeitung Skizze meines Algorithmus zu demonstrieren.

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);
    }
  }
}

Sollte funktioniert besser mit einem Fett (fett) proportionalen Schrift.

Es gibt zwei Treiber für MPlayer, dass diese Adresse, ist BW "libaa" / ascii-art genannt, die andere "libcaca":

Quellen sind für beide, ich erinnere mich nicht unter die Lizenz.

Sehen Sie dies für Screenshots beiden Libs in Aktion: http://liquidweather.net/howto/index.php?id=74

Es ist sogar einfacher als PhiLho Antwort. machen Sie einfach den Text zu einem Bild von der gleichen Größe ganz in Weiß auf schwarzem Hintergrund (diese vorab erzeugt werden könnte, wenn Sie mögen) und multiplizieren dieses „Textmaske“ Bild mit Ihrem Quellbild. Das Verwischen der Quellbild mit einem Gaußsche Unschärfe, dessen Radius ist vergleichbar mit der Textgröße wünschenswert sein könnte, wenn Sie nicht möchten, kleinere als Zeichen Detail sichtbar bleiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top