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中实现的RC4算法
Feb 14 Python
python使用装饰器和线程限制函数执行时间的方法
Apr 18 Python
深入理解python中的atexit模块
Mar 07 Python
在cmd命令行里进入和退出Python程序的方法
May 12 Python
Python hashlib模块用法实例分析
Jun 12 Python
Python内存读写操作示例
Jul 18 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
基于Python的Jenkins的二次开发操作
May 12 Python
python实现简单遗传算法
Sep 18 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 Python
Python实战之疫苗研发情况可视化
May 18 Python
Python制作一个随机抽奖小工具的实现
Jul 07 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
DSP接收机前端设想
2021/03/02 无线电
请php正则走开
2008/03/15 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
js 3种归并操作的实例代码
2013/10/30 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
会计实习生自我鉴定
2013/12/12 职场文书
电教室标语
2014/06/20 职场文书
领导干部考核评语
2015/01/04 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书