如何以编程方式重现以下效果?
(来源:artext.co.uk)
如果可能的话,我想自动化这个过程,但是可以控制输出(IE,反转颜色托盘以产生暗图像的浅色背景等)。如果可能的话,以矢量格式生成结果也很好。
更新 我不想仅使用ASCII-art重新创建,而是还要指定用于重新创建图像的字符串。
答案 0 :(得分:4)
非常简单:用网格划分图像,计算每个网格单元格上找到的像素的平均颜色(或亮度或色调等),创建相同大小的图像,绘制与网格对应的字母发现颜色的细胞。
答案 1 :(得分:2)
我有点蠢,但我最终砍了一个小Processing草图来演示我的算法。
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);
}
}
}
使用胖(粗体)等宽字体可以更好地工作。
答案 2 :(得分:0)
mplayer有两个驱动程序可以解决这个问题,一个是BW,名为“libaa”/ ascii-art,另一个是“libcaca”:
两者都可以使用来源,我不记得哪个许可证。
查看这两个libs的截图: http://liquidweather.net/howto/index.php?id=74
答案 3 :(得分:0)
这比PhiLho的回答更简单。只需将文本渲染为黑色背景上所有白色的相同大小的图像(如果您愿意,可以预先生成)并将此“文本蒙版”图像与源图像相乘。如果您不希望小于字符的细节保持可见,则可能需要使用高斯模糊模糊源图像,其半径与文本大小相当。