分享
Go有趣,5.20用Go做一个表白图/让文字跳舞
ZetaChow晓代码 · · 3342 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
今天给大家介绍一个段有趣的代码
将图片生成用文字组成的图案。看过B站那些文字组成的跳舞小姐姐的GIF吗?用这段代码你可以自己做出来。
GIF我就懒得做了,作为一个后端程序员,不是太有耐心一帧一帧截图,大家可以先看看把图案文本贴在VScode里的效果
img2txt
直接上码,说明都在代码中
/*先定义一个函数
参数:
imgPath: 图片路径
size: 生成文本后的尺寸(这个不是真实的尺寸,1代表1个像素,1个像素会被替换成1个字符,所以是字符的个数,高度是自动换算的,所以这里的size指的是"宽度"被压缩成多少像素)
txts: 将像素处理成的字符列表
rowend: 换行字符(因为windows和linux不同)
output: 生成文本文件保存路径
*/
func img2txt(imgPath string, size uint, txts []string, rowend string, output string) {
//获取图片文件
file, err := os.Open(imgPath)
if err != nil {
fmt.Println(err.Error())
return
}
defer file.Close()
//用图片文件获取图片对象
img, err := png.Decode(file)
if err != nil {
fmt.Println(err.Error())
return
}
//用将宽度设置为size,然后换算出等比例的高度
var width = size
var height = (size * uint(img.Bounds().Dy())) / (uint(img.Bounds().Dx()))
height = height * 6 / 10 //这里6/10是大致字符的宽高比
newimg := resize.Resize(width, height, img, resize.Lanczos3) //根据高宽resize图片,并得到新图片的像素值
dx := newimg.Bounds().Dx()
dy := newimg.Bounds().Dy()
//创建一个字节buffer,一会用来保存字符
textBuffer := bytes.Buffer{}
//遍历图片每一行每一列像素
for y := 0; y < dy; y++ {
for x := 0; x < dx; x++ {
colorRgb := newimg.At(x, y)
r, g, b, _ := colorRgb.RGBA()
//获得三原色的值,算一个平均数出来
avg := uint8((r + g + b) / 3 >> 8)
//有多少个用来替换的字符就将256分为多少个等分,然后计算这个像素的平均值趋紧与哪个字符,最后,将这个字符添加到字符buffer里
num := avg / uint8(256/len(txts))
textBuffer.WriteString(txts[num])
fmt.Print(txts[num]) //打印出来
}
textBuffer.WriteString(rowend) //一行结束,换行
fmt.Print(rowend)
}
//将字符buffer的数据写入到文本文件里,结束。
f, err := os.Create(output + ".txt")
if err != nil {
fmt.Println(err.Error())
return
}
defer f.Close()
f.WriteString(textBuffer.String())
}
然后,在main函数里
func main() {
img2txt("你的图片.png", 200, []string{"@", "#", "*", "%", "+", ",", ".", " "}, "\n", "./保存的文本.txt")
}
搞定!!!
go run main.go
试试看,打开刚才保存的文件看看效果
喜欢让朋友惊讶的你,可以用他们的照片做一个文本图片啦、跳舞小姐姐的文字啦、代码里放有图案的注释啦....
猜猜她是谁?
image.png
喜欢的同学可以加我的公众号,和大家一起发现一起学习编程的乐趣
晓代码
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信3342 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
今天给大家介绍一个段有趣的代码
将图片生成用文字组成的图案。看过B站那些文字组成的跳舞小姐姐的GIF吗?用这段代码你可以自己做出来。
GIF我就懒得做了,作为一个后端程序员,不是太有耐心一帧一帧截图,大家可以先看看把图案文本贴在VScode里的效果
img2txt
直接上码,说明都在代码中
/*先定义一个函数
参数:
imgPath: 图片路径
size: 生成文本后的尺寸(这个不是真实的尺寸,1代表1个像素,1个像素会被替换成1个字符,所以是字符的个数,高度是自动换算的,所以这里的size指的是"宽度"被压缩成多少像素)
txts: 将像素处理成的字符列表
rowend: 换行字符(因为windows和linux不同)
output: 生成文本文件保存路径
*/
func img2txt(imgPath string, size uint, txts []string, rowend string, output string) {
//获取图片文件
file, err := os.Open(imgPath)
if err != nil {
fmt.Println(err.Error())
return
}
defer file.Close()
//用图片文件获取图片对象
img, err := png.Decode(file)
if err != nil {
fmt.Println(err.Error())
return
}
//用将宽度设置为size,然后换算出等比例的高度
var width = size
var height = (size * uint(img.Bounds().Dy())) / (uint(img.Bounds().Dx()))
height = height * 6 / 10 //这里6/10是大致字符的宽高比
newimg := resize.Resize(width, height, img, resize.Lanczos3) //根据高宽resize图片,并得到新图片的像素值
dx := newimg.Bounds().Dx()
dy := newimg.Bounds().Dy()
//创建一个字节buffer,一会用来保存字符
textBuffer := bytes.Buffer{}
//遍历图片每一行每一列像素
for y := 0; y < dy; y++ {
for x := 0; x < dx; x++ {
colorRgb := newimg.At(x, y)
r, g, b, _ := colorRgb.RGBA()
//获得三原色的值,算一个平均数出来
avg := uint8((r + g + b) / 3 >> 8)
//有多少个用来替换的字符就将256分为多少个等分,然后计算这个像素的平均值趋紧与哪个字符,最后,将这个字符添加到字符buffer里
num := avg / uint8(256/len(txts))
textBuffer.WriteString(txts[num])
fmt.Print(txts[num]) //打印出来
}
textBuffer.WriteString(rowend) //一行结束,换行
fmt.Print(rowend)
}
//将字符buffer的数据写入到文本文件里,结束。
f, err := os.Create(output + ".txt")
if err != nil {
fmt.Println(err.Error())
return
}
defer f.Close()
f.WriteString(textBuffer.String())
}
然后,在main函数里
func main() {
img2txt("你的图片.png", 200, []string{"@", "#", "*", "%", "+", ",", ".", " "}, "\n", "./保存的文本.txt")
}
搞定!!!
go run main.go
试试看,打开刚才保存的文件看看效果
喜欢让朋友惊讶的你,可以用他们的照片做一个文本图片啦、跳舞小姐姐的文字啦、代码里放有图案的注释啦....
猜猜她是谁?
image.png
喜欢的同学可以加我的公众号,和大家一起发现一起学习编程的乐趣
晓代码