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 22 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
python实现简单flappy bird
Dec 24 Python
python实现海螺图片的方法示例
May 12 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
django rest framework 过滤时间操作
Jul 12 Python
python redis存入字典序列化存储教程
Jul 16 Python
编写python代码实现简单抽奖器
Oct 20 Python
jupyter notebook 写代码自动补全的实现
Nov 02 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
Python实现随机生成迷宫并自动寻路
python中opencv实现图片文本倾斜校正
Jun 11 #Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Python-OpenCV实现图像缺陷检测的实例
Python中OpenCV实现简单车牌字符切割
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
You might like
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
php中explode与split的区别介绍
2012/10/03 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
python3 实现的人人影视网站自动签到
2016/06/19 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
python实现字符串和字典的转换
2018/09/29 Python
Python饼状图的绘制实例
2019/01/15 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
Python中格式化字符串的四种实现
2020/05/26 Python
优秀村官事迹材料
2014/01/10 职场文书
《手指教学》反思
2014/02/14 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
后备干部培训方案
2014/05/22 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
工艺技术员岗位职责
2015/02/04 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书