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实现在pickling的时候压缩的方法
Sep 25 Python
python中__call__方法示例分析
Oct 11 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
如何利用python查找电脑文件
Apr 27 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
Python for i in range ()用法详解
Sep 18 Python
Django中和时区相关的安全问题详解
Oct 12 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 Python
python中validators库的使用方法详解
Sep 23 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
php中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
html5 canvas 详细使用教程
2017/01/20 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
基于jQuery的表单填充实例
2017/08/22 jQuery
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
python基于queue和threading实现多线程下载实例
2014/10/08 Python
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
python使用opencv进行人脸识别
2017/04/07 Python
python reduce 函数使用详解
2017/12/05 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
python中栈的原理及实现方法示例
2019/11/27 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
python switch 实现多分支选择功能
2020/12/21 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
大学团支书的自我评价分享
2013/12/14 职场文书
学校办公室主任职责
2013/12/27 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
大学生十八大感想
2015/08/11 职场文书
HTML通过表单实现酒店筛选功能
2021/05/18 HTML / CSS
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android