Python实现生成bmp图像的方法


Posted in Python onJune 13, 2021

之前使用过c、java、go语言实现过生成纯色BMP图片的功能。

现在由python语言完成该功能。

from array import array

class bmp:
    """ bmp data structure """

    def __init__(self, w=1080, h=1920, color = 0xffffff):
        self.w = w
        self.h = h
        self.gen_bmp_header()
        self.paint_bgcolor(color)

    def calc_data_size (self):
        if((self.w*3)%4 == 0):
            self.dataSize = self.w * 3 * self.h
        else:
            self.dataSize = (((self.w * 3) // 4 + 1) * 4) * self.h

        self.fileSize = self.dataSize + 54

    def conv2byte(self, l, num, len):
        tmp = num
        for i in range(len):
            l.append(tmp & 0x000000ff)
            tmp >>= 8

    def gen_bmp_header (self):
        self.calc_data_size();
        self.bmp_header = [0x42, 0x4d]
        self.conv2byte(self.bmp_header, self.fileSize, 4) #file size
        self.conv2byte(self.bmp_header, 0, 2)
        self.conv2byte(self.bmp_header, 0, 2)
        self.conv2byte(self.bmp_header, 54, 4) #rgb data offset
        self.conv2byte(self.bmp_header, 40, 4) #info block size
        self.conv2byte(self.bmp_header, self.w, 4)
        self.conv2byte(self.bmp_header, self.h, 4)
        self.conv2byte(self.bmp_header, 1, 2)
        self.conv2byte(self.bmp_header, 24, 2) #888
        self.conv2byte(self.bmp_header, 0, 4)  #no compression
        self.conv2byte(self.bmp_header, self.dataSize, 4) #rgb data size
        self.conv2byte(self.bmp_header, 0, 4)
        self.conv2byte(self.bmp_header, 0, 4)
        self.conv2byte(self.bmp_header, 0, 4)
        self.conv2byte(self.bmp_header, 0, 4)

    def print_bmp_header (self):
        length = len(self.bmp_header)
        for i in range(length):
            print("{:0>2x}".format(self.bmp_header[i]), end=' ')
            if i%16 == 15:
                print('')
        print('')

    def paint_bgcolor(self, color=0xffffff):
        self.rgbData = []
        for r in range(self.h):
            self.rgbDataRow = []
            for c in range(self.w):
                self.rgbDataRow.append(color)
            self.rgbData.append(self.rgbDataRow)

    def paint_line(self, x1, y1, x2, y2, color):
        k = (y2 - y1) / (x2 - x1)
        for x in range(x1, x2+1):
            y = int(k * (x - x1) + y1)
            self.rgbData[y][x] = color

    def paint_rect(self, x1, y1, w, h, color):
        for x in range(x1, x1+w):
            for y in range(y1, y1+h):
                self.rgbData[y][x] = color

    def paint_point(self, x, y, color=0x000000):
        self.rgbData[y][x] = color

    def save_image(self, name="save.bmp"):
        f = open(name, 'wb')

        #write bmp header
        f.write(array('B', self.bmp_header).tobytes())

        #write rgb data
        zeroBytes = self.dataSize // self.h - self.w * 3

        for r in range(self.h):
            l = []
            for i in range(len(self.rgbData[r])):
                p = self.rgbData[r][i]
                l.append(p & 0x0000ff)
                p >>= 8
                l.append(p & 0x0000ff)
                p >>= 8
                l.append(p & 0x0000ff)

            f.write(array('B', l).tobytes())

            for i in range(zeroBytes):
                f.write(bytes([0x00]))

        #close file
        f.close()

if __name__ == '__main__':


    image = bmp(35, 35)

    for i in range(35):
        image.paint_point(i, i, 0xff0000)

    image.save_image("save1.bmp")
    import os
    os.system("save1.bmp")

到此这篇关于Python实现生成bmp图像的方法的文章就介绍到这了,更多相关Python生成bmp图像内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python多线程http下载实现示例
Dec 30 Python
pygame学习笔记(4):声音控制
Apr 15 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 Python
Python之父谈Python的未来形式
Jul 01 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
python解析含有重复key的json方法
Jan 22 Python
python 字典操作提取key,value的方法
Jun 26 Python
django写用户登录判定并跳转制定页面的实例
Aug 21 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
python 字段拆分详解
Dec 17 Python
在python中对于bool布尔值的取反操作
Dec 11 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
php数组一对一替换实现代码
2012/08/31 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
node.js通过url读取文件
2020/10/16 Javascript
一文总结学习Python的14张思维导图
2017/10/17 Python
Windows下PyCharm安装图文教程
2018/08/27 Python
详解python运行三种方式
2019/05/13 Python
Python微信操控itchat的方法
2019/05/31 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
幼儿园实习生辞职信
2014/01/20 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
个人合伙协议书范本
2014/10/14 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
校长一岗双责责任书
2015/05/09 职场文书
实习证明格式范文
2015/06/16 职场文书
《角的度量》教学反思
2016/02/18 职场文书