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 相关文章推荐
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
Python正则简单实例分析
Mar 21 Python
Python 自动化表单提交实例代码
Jun 08 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
python实现自动登录
Sep 17 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
python3正则模块re的使用方法详解
Feb 11 Python
python爬取2021猫眼票房字体加密实例
Feb 19 Python
scrapy-splash简单使用详解
Feb 21 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
jQuery中:radio选择器用法实例
2015/01/03 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
jquery图片放大镜效果
2017/06/23 jQuery
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
如何基于python实现脚本加密
2019/12/28 Python
Python3 assert断言实现原理解析
2020/03/02 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
Python pip 常用命令汇总
2020/10/19 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
应届生个人求职信模板
2013/11/26 职场文书
生产部管理制度
2014/01/31 职场文书
商业项目策划方案
2014/06/05 职场文书
升国旗演讲稿
2014/09/05 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
Python机器学习之底层实现KNN
2021/06/20 Python