图片转点阵字符

前几天中了抖音的毒,写了这个玩意儿。

大致思路是把图片转换成灰度图,再把每个像素点对应成字符。

我的环境是codeblocks+mingw64+opencv。

首先,我们要知道到底把相应灰度对应成哪个字符。
“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()_+-=[]\{}|;’:”,./<>? “
以上是所有键盘上可以按出来的字符。把这些字符按照每个字符所占的黑色像素点多少排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <algorithm>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
string s="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()_+-=[]\{}|;':\",./<>? ";
struct Temps
{
int priority;
char c;
};
int cmp(Temps a,Temps b)
{
return a.priority<b.priority;
}
int getpriority(string c)
{
int ans=0;
Mat a(60,60,CV_8UC3,Scalar(255,255,255));
putText(a,c,Point(0,40),FONT_HERSHEY_DUPLEX,1.5,Scalar(0,0,0),2,8,0);
auto it=a.begin<Vec3f>();
for(;it!=a.end<Vec3f>();it++)
{
if((*it)[0]==0 && (*it)[1]==0 && (*it)[2]==0)
ans++;
}

return ans;
}
int main()
{
std::ios::sync_with_stdio(false);
Temps *arrays = new Temps[s.size()];
for(int i=0;i<s.size();i++)
{
arrays[i].c=s[i];
arrays[i].priority=getpriority(s.substr(i,1));
}
sort(arrays,arrays+s.size(),cmp);
for(int i=0;i<s.size();i++)
{
cout<<arrays[i].c;
}
return 0;

运行代码得到序列
“ |’`.”,!:v^;iIl}y{tY()~1j/_rJ]ufVnc>x-Lw7?T*oUhX[CaKFskdqH+NG0A4Obpz2PW3QemDSMZ9%g6E5$R8=&B@#" 现在再把灰度对应到这个序列上就行了。 <!--1--

第25行,就是把像素点转换成灰度。
第26行就是把灰度转换成对应的字符。
然后这就是全部的代码啦。。

文章目录