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内存管理分析
Apr 08 Python
用Python进行行为驱动开发的入门教程
Apr 23 Python
python 实时遍历日志文件
Apr 12 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
python中subprocess批量执行linux命令
Apr 27 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
Python通用函数实现数组计算的方法
Jun 13 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
Numpy 多维数据数组的实现
Jun 18 Python
Python实现Telnet自动连接检测密码的示例
Apr 16 Python
Pyhton爬虫知识之正则表达式详解
Apr 01 Python
python实现学员管理系统(面向对象版)
Jun 05 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
win7安装python生成随机数代码分享
2013/12/27 Python
python学习入门细节知识点
2018/03/29 Python
python求最大连续子数组的和
2018/07/07 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
Hotels.com中国区:好订网
2016/08/18 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
士力架广告词
2014/03/20 职场文书
工会换届选举方案
2014/05/21 职场文书
销售提升方案
2014/06/07 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
单位接收函格式
2015/01/30 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
Selenium浏览器自动化如何上传文件
2022/04/06 Python