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下singleton模式的实现方法
Jul 16 Python
Python挑选文件夹里宽大于300图片的方法
Mar 05 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
python3.5使用tkinter制作记事本
Jun 20 Python
python3实现域名查询和whois查询功能
Jun 21 Python
Python决策树之基于信息增益的特征选择示例
Jun 25 Python
Python代码块批量添加Tab缩进的方法
Jun 25 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
Python any()函数的使用方法
Oct 28 Python
python 浮点数四舍五入需要注意的地方
Aug 18 Python
Python中tkinter的用户登录管理的实现
Apr 22 Python
Python实现智慧校园自动评教全新版
Jun 18 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
PHP类的封装与继承详解
2015/09/29 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
Python中使用动态变量名的方法
2014/05/06 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
举例讲解Python装饰器
2020/12/24 Python
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
素质拓展感言
2014/01/29 职场文书
竞选班委演讲稿
2014/04/28 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
异地年检委托书范本
2014/09/24 职场文书
2014年工人工作总结
2014/11/25 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
文艺演出主持词
2015/07/01 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python
Python基础之Socket通信原理
2021/04/22 Python
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python