Modificare a livello di codice un'immagine per sostituire i dettagli con il testo?

StackOverflow https://stackoverflow.com/questions/416376

  •  03-07-2019
  •  | 
  •  

Domanda

Come si potrebbe riprodurre in modo programmatico il seguente effetto?


(fonte: artext.co.uk )

Vorrei automatizzare il processo, se possibile, ma avere un certo controllo sull'output (IE, invertendo il pallet dei colori per produrre uno sfondo chiaro per immagini scure, ecc.). Produrre risultati in formato vettoriale sarebbe fantastico se possibile anche.

Aggiornamento: Piuttosto che ricrearlo con l'arte ASCII, vorrei anche specificare la stringa utilizzata per ricreare l'immagine.

È stato utile?

Soluzione

È abbastanza semplice: dividi l'immagine con una griglia, calcola il colore medio (o luminosità o tonalità, ecc.) dei pixel trovati su ciascuna cella della griglia, crea un'immagine della stessa dimensione, disegna la lettera corrispondente alla griglia cella con il colore trovato.

Altri suggerimenti

Ero un po 'vivace, ma alla fine ho hackerato un po' Processing per dimostrare il mio algoritmo.

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

Dovrebbe funzionare meglio con un carattere monospazio (grassetto) grasso.

Ci sono due driver per mplayer che risolvono questo problema, uno è BW chiamato " libaa " / ascii-art, l'altro "libcaca":

Le fonti sono disponibili per entrambi, non ricordo con quale licenza.

Vedi questo per gli screenshot di entrambe le librerie in azione: http://liquidweather.net/howto/index.php?id=74

È persino più semplice della risposta di PhiLho. Basta eseguire il rendering del testo su un'immagine della stessa dimensione in tutto il bianco su sfondo nero (questo potrebbe essere pre-generato se lo desideri) e moltiplicare questa "maschera di testo" immagine con l'immagine sorgente. La sfocatura dell'immagine sorgente con una sfocatura gaussiana il cui raggio è paragonabile alla dimensione del testo potrebbe essere desiderabile se non si desidera che i dettagli più piccoli del carattere rimangano visibili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top