2009-01-06 45 views
2

如何以编程方式重现以下效果?

http://www.artext.co.uk/images/twofonts%20typography%20ascii%201.gif以编程方式修改图像以用文本替换细节?

我想如果可能的过程自动化,但是具有在输出一定的控制(IE,反相调色板以产生用于暗图像的背景光等)。如果可能的话,以矢量格式生成结果将会很好。

更新: 而不是只是用ASCII艺术重新创建,我想指定用于重新创建图像的字符串。

回答

4

这很简单:用网格划分图像,计算每个网格单元上找到的像素的平均颜色(或发光度或色调等),创建一个相同大小的图像,绘制相应的字母网格单元格与发现的颜色。

+0

这将假设一个固定宽度的字体? – 2009-01-06 12:51:21

0

有两个驱动MPlayer的是解决这个问题,一个是BW称为“libaa”/ASCII艺术,其他的“libcaca”:

源可用于两个,我不记得下的许可证。

看到在行动这个两个库的截图: http://liquidweather.net/howto/index.php?id=74

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

应该用胖(粗体)等宽字体更好地工作。

0

它比PhiLho的答案更简单。只需将文本呈现为黑色背景上所有白色大小相同的图像(如果您愿意,可以预先生成这些图像),然后将此“文本遮罩”图像与源图像相乘。如果您不希望小于字符的细节保持可见,则可以使用半径与文本大小相当的高斯模糊来模糊源图像。

相关问题