ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7954|回复: 34

[求助] 图片转换成字符图

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-10-15 13:01 | 显示全部楼层 |阅读模式

在网上看到一个帖子,说的是《图片转换成字符图》。好像是python语言,但是我不懂,哪位高手要是懂这个语言,把它改编成vba的《图片转换成字符图》就好了。
链接:https://blog.csdn.net/darren817/article/details/79824823
另外有一篇《简单实现图片转彩色字符画》,链接:https://blog.csdn.net/kongfu_cat/article/details/79511087
第一篇文章大致编程如下,或者请看第一个链接。

#-*- coding:utf-8 -*-from PIL import Imageimport argparse#命令行输入参数处理parser = argparse.ArgumentParser()parser.add_argument('file')     #输入文件parser.add_argument('-o', '--output')   #输出文件parser.add_argument('--width', type = int, default = 80) #输出字符画宽parser.add_argument('--height', type = int, default = 80) #输出字符画高#获取参数args = parser.parse_args()IMG = args.fileWIDTH = args.widthHEIGHT = args.heightOUTPUT = args.output#这里的list可以自己定义ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")# 将256灰度映射到70个字符上def get_char(r,g,b,alpha = 256):    if alpha == 0:        return ' '    length = len(ascii_char)    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)    unit = (256.0 + 1)/length    return ascii_char[int(gray/unit)]if __name__ == '__main__':    im = Image.open(IMG)    im = im.resize((WIDTH,HEIGHT), Image.NEAREST)    txt = ""    for i in range(HEIGHT):        for j in range(WIDTH):            txt += get_char(*im.getpixel((j,i)))        txt += '\n'    print txt    #字符画输出到文件    if OUTPUT:        with open(OUTPUT,'w') as f:            f.write(txt)    else:        with open("output.txt",'w') as f:            f.write(txt)
因为看不懂,不知如何下手,麻烦高手,能否实现?vba如何编写,谢谢。

TA的精华主题

TA的得分主题

发表于 2018-10-15 16:27 | 显示全部楼层
bits(0,2,3)代表从图形左下角数起横向第2个纵向第3个像素的Blue值,而bits(1,2,3)和bits(2,2,3)分别的Green值和Red值

bytTarget = bits(0, ix, iy) * 0.11 + bits(1, ix, iy) * 0.59 + bits(2, ix, iy) * 0.3 '这是传统的根据三原色亮度加权得到灰阶的算法

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-15 20:16 | 显示全部楼层
zopey 发表于 2018-10-15 16:27
bits(0,2,3)代表从图形左下角数起横向第2个纵向第3个像素的Blue值,而bits(1,2,3)和bits(2,2,3)分别的Green ...

能做出附件吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-15 20:53 | 显示全部楼层
zopey 发表于 2018-10-15 16:27
bits(0,2,3)代表从图形左下角数起横向第2个纵向第3个像素的Blue值,而bits(1,2,3)和bits(2,2,3)分别的Green ...

你说的是小fisher写的,http://club.excelhome.net/forum. ... 986&pid=2561266,我也曾经改编过这个程序,直接在窗体改变黑白度和灰度,但这个做不好。

TA的精华主题

TA的得分主题

发表于 2018-10-15 23:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
dongdonggege 发表于 2018-10-15 20:53
你说的是小fisher写的,http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=400986&p ...

得出了 图片灰度的 二维数组,再 建立横竖坐标 和字符置换表(255灰度-70字符) ,输出到 txt 。

参考 16楼文档
http://club.excelhome.net/thread-1403768-2-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-16 08:22 | 显示全部楼层
本帖最后由 dongdonggege 于 2018-10-16 08:23 编辑
zopey 发表于 2018-10-15 23:13
得出了 图片灰度的 二维数组,再 建立横竖坐标 和字符置换表(255灰度-70字符) ,输出到 txt 。

参考 ...

1、你说的16楼文件,我这显示丢失Microsoft Windows Common Controls 6.0 (SP6)
2、字符置换表,我这第125行,不知道怎么输出txt?
3、我打包,另有图片,请看怎么改。
我这已经做出半成品了,麻烦帮我修改,谢谢。

求助图片转换成字符图.rar

112.72 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2018-10-16 14:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 按钮1_Click()
Cells.Clear
Dim fn, f
Dim arr() As Byte, H, i
fn = Application.GetOpenFilename("图像文件,*.*", , "请选文件", , MultiSelect:=True)
If Not IsArray(fn) Then Exit Sub
For Each f In fn
    Open f For Binary As #1
    H = LOF(1)
    ReDim arr(1 To H)
    Get #1, , arr
    Close #1

    '获取图片的像素高和宽。宽度不是4的倍数时需补零
    PixelCol = 0: PixelRow = 0: Zeroize = 0
    For i = 0 To 3
        PixelCol = PixelCol + arr(i + 19) * 256 ^ i
    Next
    For i = 0 To 3
        PixelRow = PixelRow + arr(i + 23) * 256 ^ i
    Next
    If PixelCol Mod 4 <> 0 Then Zeroize = PixelCol Mod 4

    Dim brr()
    ReDim brr(1 To PixelRow, 1 To PixelCol)

    ascii_char = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\^`'. "
    pLength = Len(ascii_char)
    unit = (256# + 1) / pLength

    CellRow = 0
    For i = PixelRow To 1 Step -1
        CellRow = CellRow + 1
        CellCol = 0
        For j = 1 To PixelCol * 3 Step 3
            CellCol = CellCol + 1
            lngPos = arr(11) + j + (i - 1) * (PixelCol * 3 + Zeroize)
            bytTarget = arr(lngPos) * 0.299 + arr(lngPos + 1) * 0.587 + arr(lngPos + 2) * 0.114

            brr(CellRow, CellCol) = Mid(ascii_char, Int(bytTarget / unit) + 1, 1)
        Next
    Next

    [a1].Resize(PixelRow, PixelCol) = brr
Next
End Sub


24位图片.zip (42.25 KB, 下载次数: 30)

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-16 16:16 | 显示全部楼层
zopey 发表于 2018-10-16 14:25
Sub 按钮1_Click()
Cells.Clear
Dim fn, f

不好意思,我刚上了两节课,
1、你这个还是提示丢失Microsoft Windows Common Controls 6.0 (SP6),什么原因?能否解说下。
2、能不能做成窗体的,麻烦你,谢谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-16 16:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-10-16 16:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
dongdonggege 发表于 2018-10-16 16:24
有时22行和25行,会提示溢出。

图像像素 要事先压缩到100 *100左右
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 20:02 , Processed in 0.036060 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表