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实现列表转换成字典数据结构的方法
Mar 11 Python
Python如何判断数独是否合法
Sep 08 Python
python操作mysql数据库
Mar 05 Python
python中defaultdict的用法详解
Jun 07 Python
python出现"IndentationError: unexpected indent"错误解决办法
Oct 15 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
python实现合并两个排序的链表
Mar 03 Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 Python
基于python 等频分箱qcut问题的解决
Mar 03 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
如何将数据从文本导入到mysql
2006/10/09 PHP
PHP URL路由类实例
2013/11/12 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
PHP调用其他文件中的类
2018/04/02 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
python字符串的index和find的区别详解
2020/06/20 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
CSS3实现时间轴特效
2020/11/02 HTML / CSS
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
学生励志演讲稿
2014/01/06 职场文书
高一地理教学反思
2014/01/18 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书