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中的变量的数据类型
May 13 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
python好玩的项目—色情图片识别代码分享
Nov 07 Python
Python实现购物车功能的方法分析
Nov 10 Python
python逆序打印各位数字的方法
Jun 25 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
django 自定义过滤器的实现
Feb 26 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
5行Python代码实现图像分割的步骤详解
May 25 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
解析php入库和出库
2013/06/25 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
javascript生成随机大小写字母的方法
2014/02/20 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
浅析javascript的return语句
2015/12/15 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
python关键字and和or用法实例
2015/05/28 Python
python线程池threadpool使用篇
2018/04/27 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
python爬取网易云音乐评论
2018/11/16 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
会计实习生自我鉴定
2013/12/12 职场文书
2014年师德承诺书
2014/05/23 职场文书
高一军训的心得体会
2014/09/01 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
七年级数学教学反思
2016/02/17 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
MySQL 分组查询的优化方法
2021/05/12 MySQL