说明

1,输入文件格式为pgm P5格式
2,输出格式为 bmp 格式

格式图解

PGM格式 P5

BMP格式 24位真彩色

步骤

1,读取 pgm 文件,得到图片width,height,像素数据 = [G1,G2,…]
2,因为像素数据范围可能是 0–65535,或者其它,取决于文件描述。要重新映射成 0–255 以写入bmp格式的文件
3,pgm是灰度图像,一个像素只有一个值描述:G;输出采用的bmp是24位真彩色,有3个byte描述一个像素,所以令 R = G = B = G

代码

# -*- coding: UTF-8 -*-
# python2import mathclass PGM(object):def __init__(self):self.magic_number = ''self.width = -1self.height = -1self.deep = -1self.bytes_for_pix = -1self.data = []def __str__(self):rtn_str = 'magic_number: ' + self.magic_number + '\n'rtn_str += 'width: ' + str(self.width) + '\n'rtn_str += 'height: ' + str(self.height) + '\n'rtn_str += 'deep: ' + str(self.deep) + '\n'rtn_str += 'bytes_for_pix: ' + str(self.bytes_for_pix) + '\n'rtn_str += 'data length: ' + str(len(self.data))return rtn_strdef read_pgm(pgm_file):pgm = PGM()with open(pgm_file, 'rb') as fi:first_line = fi.readline()  # 读取第一行,是PGM图像的 描述信息, 都是 ASCII 字符result = first_line.replace('\n', '').split(' ')  # e.g.['P5', '1280', '960', '4095']pgm.magic_number = result[0]  # 魔术字,P2或者P5,本例子只读 P5 格式pgm.width = int(result[1])pgm.height = int(result[2])pgm.deep = int(result[3])  # 本PGM文件描述灰度的数据范围 [0,pgm.deep]pgm.bytes_for_pix = 1 if pgm.deep <= 256 else 2  # 每个像素用1个或者2个字节描述灰度pgm.data = []while True:byte = fi.read(pgm.bytes_for_pix)  # 几个字节描述一个像素就读一次读几个字节if byte == '':breakval = int(byte.encode('hex'), 16)  # 此像素的灰度值pgm.data.append(val)return pgmdef write_bmp(pgm):def get_size_data(value):base_str = '%08x' % value  # 数值转为16进制的 AABBCCDD 字符串width_str_list = []for i in range(0, len(base_str), 2):width_str_list.append(base_str[i:i+2])  # 转为 [AA, BB, CC, DD]width_str_list = width_str_list[::-1]  # 转为小端模式 [DD, CC, BB, AA]return ' '.join(width_str_list)  # 转为字符串 'DD CC BB AA'width_str = get_size_data(pgm.width)height_str = get_size_data(pgm.height)# bmp文件数据头,54个字节,24位真彩色,各种描述信息不管,只修改 width 和 height 数据,小端模式。bmp_head = '42 4d 36 80 01 00 00 00 00 00 36 00 00 00 28 00 00 00 ' + width_str + ' ' + height_str + ' 01 00 18 00 00 00 00 00 00 80 01 00 74 12 00 00 74 12 00 00 00 00 00 00 00 00 00 00'bmp_head = bmp_head.split(' ')bmp_head = [int(each, 16) for each in bmp_head]# 原数据灰度范围是 0 -- pgm.deep, bmp是 0--256,所以要缩放factor = int(math.ceil(pgm.deep/256.))  # 向上取整,务使缩放后的数据范围在0--255bmp_data = [each/factor for each in pgm.data]# 跟原图比是上下倒的,反一下bmp_data = bmp_data[::-1]# 跟原图比是左右倒的,对每行再反一下out_data = []for pos in range(0, len(bmp_data), pgm.width):out_data += bmp_data[pos: pos + pgm.width][::-1]with open('output.bmp', 'wb') as fo:for byte in bmp_head:# bmp 头数据fo.write(('%02x' % byte).decode('hex'))import sysold = 0for i, byte in enumerate(out_data):prss = i/(len(out_data) * 1.0) * 100if prss > old + 10:old += 10sys.stdout.write('. ')# 因为bmp有 R G B,pgm只有一个灰度,取R=G=B=灰度值fo.write(('%02x' % byte).decode('hex'))fo.write(('%02x' % byte).decode('hex'))fo.write(('%02x' % byte).decode('hex'))if __name__ == '__main__':pgm = read_pgm('img.pgm')write_bmp(pgm)try:input('done')except Exception as e:pass

python pgm 转 bmp相关推荐

  1. python pgm转jpg批处理

    使用keras进行行人检测分类器的时候,使用了Daimler Pedestrian Classification Benchmark Dataset数据集,由于图像为 .pgm 格式,而 Keras ...

  2. python opencv 中bmp转raw格式图片并展示

    python中bmp转raw格式图片并展示 import numpy as np import cv2 img = cv2.imread('data/04/04(1).bmp') # 这里需要我们在当 ...

  3. python读取bmp文件_如何在python中读取bmp文件头?

    您可以使用imghdr module(在python stdlib中):>>> import imghdr >>> print(imghdr.what(input_ ...

  4. pgm转换bmp c语言,PGM格式显示转换代码!_NONO

    BOOL ImageDib::ReadPGM(LPCTSTR lpszPathName) { //pgm文件头信息 char *fStream; int arg[4]; //读模式打开图像文件 CFi ...

  5. Python转换图片bmp格式到jpg格式

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 import glob import os import tensorflow as tf import shutiltf.compa ...

  6. BMP文件分析及用python读取

    一.BMP文件分析 1. 什么是BMP(位图)? 常见的图像文件格式有:BMP.JPG(JPE,JPEG).GIF等. BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格 ...

  7. Python计算机视觉编程第四章——照相机模型与增强现实

    Python计算机视觉编程 照相机模型与增强现实 (一)针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 计算照相机中心 (二)照相机标定 (三)以平面和标记 ...

  8. Python计算机视觉编程学习笔记 四 照相机模型与增强现实

    照相机模型与增强现实 (一)针孔照相机模型 1.1 照相机模型 1.2 三维点的投影 1.3照相机矩阵的分解 1.4 计算照相机中心 (二)照相机标定 (三)以平面和标记物进行姿态估计 (四)增强现实 ...

  9. 纯色bmp图片生成的效率

    各种编程语言生成纯色bmp图片的效率 之前使用了各种语言生成纯色bmp图片,这里汇总并对比下纯色bmp图片文件生成的效率. 主要指标是完成bmp文件生成的耗时时长. 为了公平客观的对比,通过linux ...

  10. python pygame实战《飞船大战外星人》

    学了一个月的python,最后两天学了下pygame,以一个小游戏结尾这段旅程. 游戏规则如下: 玩家可以通过上下左右四个键控制飞船移动,而且按住键不放可以联系移动,而不需要不断地按键松键来控制. 玩 ...

最新文章

  1. Maven 编译使用 rt.jar
  2. qt label显示图片_qt关于qmovie类的使用
  3. 人民日报新媒体中心接入神策数据,媒体阅读体验新升级
  4. 系统间通信4:基本IO通信模型
  5. Zabbix安装(server和agent)及基本配置
  6. oracle silent 安装
  7. MNIST二进制数据集探索--基于Numpy处理
  8. C语言 段错误Segmentation Fault
  9. 认知差距决定我们的人生差距?!
  10. 把rmvb格式转化为avi格式
  11. 如何在MATLAB画一个首尾相连的数据矩阵图形
  12. html里获得农历时间,获取阴历(农历)和当前日期的js代码_javascript技巧
  13. consol32.exe
  14. H.264官方软件JM源代码简单分析-解码器ldecod(转载)
  15. 去哪儿12306候补购票怎么用?
  16. wps透视表列总计移到顶部_数据透视表运行总计百分比
  17. 风靡全球3500万用户!realme真我8款潮玩新品亮相
  18. 用途:不挂断地运行命令。
  19. JSP婚纱影楼管理系统myeclipse开发sql数据库bs框架java编程jdbc
  20. 【GO】Iris框架项目初始化并解决GoLand的代码提示问题

热门文章

  1. 一些快捷键的用法,linux终端操作下
  2. 章文嵩:怎样做开源才有意义?
  3. 最强大脑-星际迷航-JQuery 版本
  4. Exception occurred during ITK-SNAP startup
  5. RabbitMQ报错 o.s.a.r.c.CachingConnectionFactory : Channel shutdown: channel error; protocol meth
  6. java过来emoji手机表情,mysql入库
  7. 解决Dev-C++ [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode
  8. 饿了么推荐系统的从0到1
  9. 成员在类中的偏移量 类成员指针
  10. 虾皮铺货应该注意什么?