看到网上很多通过字符形成的画,觉得很好玩,于是网上搜索了下原来叫字符画。
见百度百科:https://baike.baidu.com/item/%E5%AD%97%E7%AC%A6%E7%94%BB/1347002

发现了一篇文章手把手教你图片转ASCII码图 这篇文章采用的是javascript编写的,讲了其中的缘由。

大概原理是首先将图片灰化处理,然后根据灰白图片后的每个像素的rgb值,转成对应的字符,然后就行程了字符图片。

下面是通过go语言实现的图片转换功能

// imagetool project main.go
package mainimport ("bytes""fmt""image""image/color""image/gif""image/jpeg""image/png""io/ioutil""os""strconv""strings""code.google.com/p/graphics-go/graphics"
)//该工具支持将图片色彩反转,图片灰化,图片转为字符画。
//author iccboy 2017-9-2
func main() {args := os.Args //获取用户输入的所有参数if args == nil || len(args) < 4 || !(args[1] == "-r" || args[1] == "-g" || args[1] == "-t" || args[1] == "-c") {usage()return}fmt.Print("...转换中...")option := args[1]source := args[2]target := args[3]ff, _ := ioutil.ReadFile(source)bbb := bytes.NewBuffer(ff)m, _, _ := image.Decode(bbb)if option == "-r" {newRgba := fzImage(m)f, _ := os.Create(target)defer f.Close()encode(source, f, newRgba)} else if option == "-g" {newGray := hdImage(m)f, _ := os.Create(target)defer f.Close()encode(source, f, newGray)} else if option == "-c" {rectWidth := 200if len(args) > 4 {rectWidth, _ = strconv.Atoi(args[4])}newRgba := rectImage(m, rectWidth)f, _ := os.Create(target)defer f.Close()encode(source, f, newRgba)} else {ascllimage(m, target)}fmt.Println("转换完成...")
}//帮助提示信息
var usage = func() {fmt.Println("输入错误,请按照下面的格式输入:")fmt.Println("使用: imagetool [OPTION]  source_image [output]")fmt.Println("  Options is flow:")fmt.Println("    -r         图片颜色翻转")fmt.Println("    -g         图片灰度")fmt.Println("    -c         缩放文本,该参数时,可以传入图片缩放的宽度 如:imagetool -c 1.jpg c1.jpg 100")fmt.Println("    -t         转成文本")}//图片编码
func encode(inputName string, file *os.File, rgba *image.RGBA) {if strings.HasSuffix(inputName, "jpg") || strings.HasSuffix(inputName, "jpeg") {jpeg.Encode(file, rgba, nil)} else if strings.HasSuffix(inputName, "png") {png.Encode(file, rgba)} else if strings.HasSuffix(inputName, "gif") {gif.Encode(file, rgba, nil)} else {fmt.Errorf("不支持的图片格式")}
}//图片色彩反转
func fzImage(m image.Image) *image.RGBA {bounds := m.Bounds()dx := bounds.Dx()dy := bounds.Dy()newRgba := image.NewRGBA(bounds)for i := 0; i < dx; i++ {for j := 0; j < dy; j++ {colorRgb := m.At(i, j)r, g, b, a := colorRgb.RGBA()r_uint8 := uint8(r >> 8)g_uint8 := uint8(g >> 8)b_uint8 := uint8(b >> 8)a_uint8 := uint8(a >> 8)r_uint8 = 255 - r_uint8g_uint8 = 255 - g_uint8b_uint8 = 255 - b_uint8newRgba.SetRGBA(i, j, color.RGBA{r_uint8, g_uint8, b_uint8, a_uint8})}}return newRgba
}//图片灰化处理
func hdImage(m image.Image) *image.RGBA {bounds := m.Bounds()dx := bounds.Dx()dy := bounds.Dy()newRgba := image.NewRGBA(bounds)for i := 0; i < dx; i++ {for j := 0; j < dy; j++ {colorRgb := m.At(i, j)_, g, _, a := colorRgb.RGBA()g_uint8 := uint8(g >> 8)a_uint8 := uint8(a >> 8)newRgba.SetRGBA(i, j, color.RGBA{g_uint8, g_uint8, g_uint8, a_uint8})}}return newRgba
}//图片缩放, add at 2018-9-12
func rectImage(m image.Image, newdx int) *image.RGBA {bounds := m.Bounds()dx := bounds.Dx()dy := bounds.Dy()newRgba := image.NewRGBA(image.Rect(0, 0, newdx, newdx*dy/dx))graphics.Scale(newRgba, m)return newRgba
}//图片转为字符画(简易版)
func ascllimage(m image.Image, target string) {if m.Bounds().Dx() > 300 {m = rectImage(m, 300)}bounds := m.Bounds()dx := bounds.Dx()dy := bounds.Dy()arr := []string{"M", "N", "H", "Q", "$", "O", "C", "?", "7", ">", "!", ":", "–", ";", "."}fileName := targetdstFile, err := os.Create(fileName)if err != nil {fmt.Println(err.Error())return}defer dstFile.Close()for i := 0; i < dy; i++ {for j := 0; j < dx; j++ {colorRgb := m.At(j, i)_, g, _, _ := colorRgb.RGBA()avg := uint8(g >> 8)num := avg / 18dstFile.WriteString(arr[num])if j == dx-1 {dstFile.WriteString("\n")}}}
}

由于上面映入了code.google.com的组件,需要手动下载包,或者翻qiang了

转换后的结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DH3Jdlug-1658063938306)(https://img-blog.csdn.net/20170902202154973?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2Nib3kyMDA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qwyLgAwN-1658063938309)(https://img-blog.csdn.net/20170902202214908?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2Nib3kyMDA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2S3YOex-1658063938310)(https://img-blog.csdn.net/20170902202236139?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2Nib3kyMDA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l6OwPqWt-1658063938311)(https://img-blog.csdn.net/20170902202510179?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2Nib3kyMDA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DRykecex-1658063938312)(https://img-blog.csdn.net/20170902202306208?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2Nib3kyMDA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PKmEyiZD-1658063938313)(https://img-blog.csdn.net/20170902210959233?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2Nib3kyMDA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jp4a4mNd-1658063938314)(https://img-blog.csdn.net/20170902210834339?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2Nib3kyMDA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

由于上面的图片不知道怎么失效了,重新上传一次图片



从上面的效果可以看出基本功能已经实现,不过还有两个问题需要解决,一个是 gif图片转换后只保留了第一幅图,第二个是“字符画”还并不是字符画,只是一个txt文件,下面一篇文章将优化这个程序,实现gif的字符动画

golang实现图片颜色反转、图片灰度、缩放、转为字符画相关推荐

  1. 图片颜色反转算法|python

    算法优化 浮点运算转换为定点运算比较慢 移位运算比定点运算快 图片颜色反转 灰度图片颜色反转 # 灰度图片翻转 import cv2 import numpy as np img = cv2.imre ...

  2. unity 将图片颜色反转

    一直想写博客,现在先从一些简单的开始吧! 图片的颜色反转,原理就是用白色的rgb值减去当前图片颜色rgb值,得到后的效果就是反转后的颜色. unity中代码如下 //将图片颜色反转     publi ...

  3. php反转图片颜色,PHP 图片处理类(水印、透明度、缩放、相框、锐化、旋转、翻转、剪切、反色)...

    /** * 图片处理函数功能:缩放.剪切.相框.水印.锐化.旋转.翻转.透明度.反色 * 处理并保存历史记录的思路:当有图片有改动时自动生成一张新图片,命名方式可以考虑在原图片的基础上加上步骤,例如: ...

  4. 用opencv实现图片颜色反转

    # 灰度图片颜色翻转效果 import cv2 import numpy as np img = cv2.imread("1.jpg",1) imgInfo = img.shape ...

  5. 黑白图片颜色反转并保存

    将图像的黑白颜色反转并保存 import cv2 # opencv读取图像 img = cv2.imread(r'E:\Python-workspace\OpenCV\OpenCV/YY.png', ...

  6. Matlab 图片颜色反转 批量

    以原文博客第一个为例 批量,其余替换掉循环内容即可,原文链接在文末. cd C:\conda3\envs\tf2.0.0\liyue\dataset\none; %你需要的路径 audiodata=d ...

  7. python将图片转为字符画_Python将图片转换为字符画的方法

    最近在学习python,看到网上用python将图片转换成字符画便来学习一下 题目意思是,程序读入一个图片,以txt格式输出图片对应的字符画,如图所示: 以下是python代码: # coding:u ...

  8. 图片,文字在线转为字符画

    图片转换字符画 http://www.makepic.net/Tool/Image2ascii.html 文字转换字符画 http://patorjk.com/software/taag http:/ ...

  9. opencv基础之--图片颜色反转

    方法一: #0-255 255-当前 import cv2 import numpy as np img = cv2.imread('image0.jpg',1) imgInfo = img.shap ...

最新文章

  1. SEO配置信息操作文档
  2. 获取Mysql语句执行时的详细信息
  3. BZOJ 2208[Jsoi2010]连通数
  4. 【Linux】一步一步学Linux——nl命令(43)
  5. 源代码管理之SVN服务器搭建和使用
  6. 本地上传图片无法预览
  7. html 插入本地视频,win7系统中Word文档插入本地视频的方法【图文】
  8. [UITableView]简介
  9. 构建插件式的应用程序框架(四)----服务容器(ZT)
  10. 在MyEclipse中如何修啊改Tomcat 6.x的端口号
  11. 【项目总结】汽车之家
  12. 《数据库系统工程师》备考指南
  13. 原来网易的lofter界面是模仿的是tumblr
  14. vimdiff 命令使用技巧
  15. 什么决定了你的职场天花板?
  16. 三台路由器两台计算机华为,两台华为路由器桥接设置方法
  17. Win10关闭登录面板毛玻璃效果
  18. JDBC数据库连接测试工具
  19. PHP 7.1 新特性
  20. 关于硬盘分区合并的事

热门文章

  1. 运营︱如何实现用户增长?
  2. 为解决iPhone绿屏问题,苹果将和这家中国公司合作
  3. C/C++编程学习 - 第13周 ⑤ 财务管理
  4. win10开启自带的手机投屏功能方式
  5. 机器学习入门 - Google的机器学习速成课程
  6. 南京大学文博专业考研上岸经验分享
  7. 图书管理系统-成绩管理系统
  8. (油猴脚本网盘下载加速)
  9. Ratatype - 在线打字教程,提高打字速度
  10. Nature子刊:AI技术从零开始设计具有生物活性的蛋白质