用“SB”绘图

制汇节时看到有一个拍照然后转换为字符组成的画面的展示,很有意思。其实,这类东西的原理并不复杂,计算图片各点灰度值,然后用合适的方法表现出来,如不同的字符,字符的大小,字符的灰度,图形的大小……之前我弄过一个用字符“SB”的大小和灰度表现图像的,效果如下(黑一下某土豪):

graytuhao

 

放大一看,是不是就看到了无数“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;
  }
}
打赏

发表评论