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中的包和模块实例
Nov 22 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 Python
利用python3随机生成中文字符的实现方法
Nov 24 Python
Python爬虫框架scrapy实现的文件下载功能示例
Aug 04 Python
Django之使用内置函数和celery发邮件的方法示例
Sep 16 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 Python
windows中安装Python3.8.0的实现方法
Nov 19 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
Dec 03 Python
Pycharm中切换pytorch的环境和配置的教程详解
Mar 13 Python
python数据类型强制转换实例详解
Jun 22 Python
python中翻译功能translate模块实现方法
Dec 17 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
PHP4实际应用经验篇(3)
2006/10/09 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
js function定义函数使用心得
2010/04/15 Javascript
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
2019/04/30 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
儿童编程python入门
2018/05/08 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python矩阵的转置和逆转实例
2018/12/12 Python
Python 私有化操作实例分析
2019/11/21 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
手把手教你导入Go语言第三方库
2021/08/04 Golang