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在hadoop上跑起来
Jan 27 Python
Python判断两个对象相等的原理
Dec 12 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
Python打印特殊符号及对应编码解析
May 07 Python
Python参数传递实现过程及原理详解
May 14 Python
Keras实现支持masking的Flatten层代码
Jun 16 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
Python csv文件记录流程代码解析
Jul 16 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
浅谈python数据类型及其操作
May 25 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
substr()函数中文版
2006/10/09 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
基于element-ui的rules中正则表达式
2018/09/04 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
Python API自动化框架总结
2019/11/12 Python
我们是伦敦女孩:WalG
2018/01/08 全球购物
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
个人找工作求职简历的自我评价
2013/10/20 职场文书
中学生团员自我评价分享
2013/12/07 职场文书
高中班长自我鉴定
2013/12/20 职场文书
书香校园建设方案
2014/05/02 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
Python实现生活常识解答机器人
2021/06/28 Python