数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3964|回复: 5

[other] [micropython_python]黑白BMP图取模转为十六进制数组

[复制链接]
发表于 2020-7-12 22:21:33 | 显示全部楼层 |阅读模式
原理见
【MY808_DIY】从此随意自制各种点阵字库
https://www.mydigit.cn/forum.php?mod=viewthread&tid=69560

python代码

# -*- coding:utf-8 -*-

import matplotlib.image as mpimg

files = ["./0.bmp","./1.bmp","./2.bmp","./3.bmp","./4.bmp","./5.bmp","./6.bmp","./7.bmp","./8.bmp","./9.bmp","./colon.bmp"]
num_arr = []

# 读取点阵图,转为0(白)1(黑)的三维素组,[files[0][x][y]...]
for index in range(0, len(files)):
    image_arr = mpimg.imread(files[index]).T
    num3 = []
    for i in range(0,len(image_arr[0])):
        num3.append([])
        for j in range(0,len(image_arr[0])):
            if image_arr[0][j] == 255:
                num3.append(0)
            else:
                num3.append(1)
   # 行列置换
    arr2 = [ [row for row in num3] for i in range(len(num3[0])) ]
    print (arr2)

    print ("\n")
    num_arr.append(arr2)
print("\n\n")
print (num_arr)

# 01数组每8位转位16进制
ff_arr = []
for i in range(0, len(num_arr)):
    for j in range(0, len(num_arr)):
        num_str = ''
        for k in range(0, len(num_arr[j])):
            num_str += str(num_arr[j][k])
        print (num_str)
        print (hex(int(num_str,2)))
        ff_arr.append(hex(int(num_str,2)))

print (ff_arr)
print (len(ff_arr))



效果
ff_arr = ["0x0", "0x7e", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x7e", "0x0", "0x0", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x0", "0x0", "0x7e", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x7e", "0x40", "0x40", "0x40", "0x40", "0x40", "0x7e", "0x0", "0x0", "0x7e", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x7e", "0x2", "0x2", "0x2", "0x2", "0x2", "0x7e", "0x0", "0x0", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x7e", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x0", "0x0", "0x7e", "0x40", "0x40", "0x40", "0x40", "0x40", "0x40", "0x7e", "0x2", "0x2", "0x2", "0x2", "0x2", "0x7e", "0x0", "0x0", "0x7e", "0x40", "0x40", "0x40", "0x40", "0x40", "0x40", "0x7e", "0x42", "0x42", "0x42", "0x42", "0x42", "0x7e", "0x0", "0x0", "0x7e", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x2", "0x0", "0x0", "0x7e", "0x42", "0x42", "0x42", "0x42", "0x42", "0x66", "0x7e", "0x42", "0x42", "0x42", "0x42", "0x42", "0x7e", "0x0", "0x0", "0x7e", "0x42", "0x42", "0x42", "0x42", "0x42", "0x42", "0x7e", "0x2", "0x2", "0x2", "0x2", "0x2", "0x7e", "0x0", "0x0", "0x0", "0x0", "0x0", "0x18", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x0", "0x18", "0x0", "0x0", "0x0"]




8*16像素的BMP图片
bmp不能上传,下面为png图片,使用GIMP转为bmp即可。









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +33 收起 理由
家睦 + 33

查看全部打赏

发表于 2020-7-13 22:01:09 | 显示全部楼层
本帖最后由 lyy-cy 于 2020-7-14 20:21 编辑

老铁还是详细说下原理。

引用文章的原理我懂(肯定懂)。但是你这个还是有不明白的地方。:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-14 21:17:59 | 显示全部楼层
原理简析:
图像分两种,点阵图和矢量图。矢量图是根据几何特性来绘制图形,如y=x^2描述的图形;点阵图是由一个个点组成的图像,一个点对应屏幕一个像素。
点阵图也可分为两种:彩图,灰度图。彩图的每个点由4个数值表示(R,G,B,apha),灰度图每个点由一个整数值表示 (0~255 0 黑 255白)。
将灰度图转为黑白图,即每个点的数值非0即1。
逐行读取每个点的数值,存贮在数组中。
为了压缩存储数组的空间,将数组中每8个数字按二进制方式转为16进制,存贮在另一个数组中。
回复 支持 反对

使用道具 举报

发表于 2020-7-15 13:59:09 | 显示全部楼层
程序有较大的局限
if image_arr[0][j] == 255:

不是所有的单色bmp都能处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 19:33:22 | 显示全部楼层
devcang 发表于 2020-7-15 13:59
程序有较大的局限
if image_arr[0][j] == 255:

是的,程序读取的是个人绘制的图片,所以明确的取了黑白这两个极值。
这里改为一个阈值就好了,比如:
if image_arr[0][j] > 128  等等。

回复 支持 反对

使用道具 举报

发表于 2020-7-16 21:30:07 | 显示全部楼层
看到了熟悉的代码,Python队伍逐渐壮大中.........:victory:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-13 04:41 , Processed in 0.171600 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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