制汇节时看到有一个拍照然后转换为字符组成的画面的展示,很有意思。其实,这类东西的原理并不复杂,计算图片各点灰度值,然后用合适的方法表现出来,如不同的字符,字符的大小,字符的灰度,图形的大小……之前我弄过一个用字符“SB”的大小和灰度表现图像的,效果如下(黑一下某土豪):
放大一看,是不是就看到了无数“SB”呢~当然,字符是可以任意替换的,随你开心
好了,下面该上代码了。用processing写这东西其实是用不了多少代码的。因为我的那个processing用不了中文注释,当时我偷懒就没写注释,所以之前发的代码没有注释,现在已经补上了。
PImage targetImg; //原始图像对象 int a = 2; //记录图像缩小倍数的整形变量 int b = 10; //记录“SB”大小的整形变量 float gamma = 1; int addGray = 30; PImage img; //新建img图像对象用来储存缩小后的图像 void setup(){ size(1280,1024); targetImg = loadImage("text.png"); //原始图像对象赋值 image(targetImg,0,0,targetImg.width/a,targetImg.height/a);//在原点将原始图原大小缩小a倍后显示(用缩小显示再截屏的方法省去自己写图像缩放的算法) img = get(0,0,targetImg.width/a,targetImg.height/a); //将缩小后的图像赋值给img图像变量(用get函数截屏取图的方式) //noLoop(); } void draw(){ background(255); //清空屏幕,背景全白(从而可以动态调整参数) for(int x = 1;x<targetImg.width/a+1;x++){ //嵌套for循环扫屏 for(int y = 1;y<targetImg.height/a+1;y++){ color c1 = img.get(x,y); //获取图像上点的颜色数据赋值给c1变量 int gray = int(red(c1)*gamma*0.299+green(c1)*gamma*0.587+blue(c1)*gamma*0.114); //color c2 = color(gray); //将计算出的整形数据gray强行变为颜色类型数据赋值给c2变量 textSize(int(255-gray)/6+1); //fill(gray); //fill(c1); fill(constrain(gray-addGray,0,255)); 根据addGray变量的设定调整灰度值并用constrain函数限制数据范围为0-255 text("SB",x*b,y*b); } } } void keyPressed(){ //用键盘动态调整a,b,addGray if(key =='j'){ a += 1; }else if(key == 'k'){ a -= 1; }else if(key == 'u'){ b += 1; }else if(key == 'i'){ b -= 1; }else if(key == 'o'){ addGray += 3; }else if(key == 'p'){ addGray -= 3; } } |