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中定义结构体的方法
Mar 04 Python
Python脚本实现DNSPod DNS动态解析域名
Feb 14 Python
python 容器总结整理
Apr 04 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
python复制文件到指定目录的实例
Apr 27 Python
python爬虫实例详解
Jun 19 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
Django框架模板用法入门教程
Nov 04 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
浅谈matplotlib默认字体设置探索
Feb 03 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 Python
方法汇总:Python 安装第三方库常用
Apr 26 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
PHP重载基础知识回顾
2020/09/10 PHP
tagName的使用,留一笔
2006/06/26 Javascript
动态添加js事件实现代码
2009/03/12 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
在linux中使用包管理器安装node.js
2015/03/13 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
python获取网页状态码示例
2014/03/30 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
python自定义时钟类、定时任务类
2021/02/22 Python
python数据归一化及三种方法详解
2019/08/06 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
keras中的History对象用法
2020/06/19 Python
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
存储过程和函数的区别
2013/05/28 面试题
如何在C# winform中异步调用web services
2015/09/21 面试题
比较一下entity bean和session bean
2013/12/27 面试题
学习雷锋精神倡议书
2015/04/27 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android
Win11如何修改dns?Win11修改dns图文教程
2022/01/18 数码科技
利用Python实现模拟登录知乎
2022/05/25 Python