python – 创建二进制PBM / PGM / PPM
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 创建二进制PBM / PGM / PPM,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2279字,纯文字阅读大概需要4分钟。
内容图文
![python – 创建二进制PBM / PGM / PPM](/upload/InfoBanner/zyjiaocheng/816/e12db2cf15fd48c39880f08598de8fc8.jpg)
我正在尝试了解如何创建二进制PBM / PGM / PPM文件.据我所知,每种格式有两种类型:普通格式和原始格式.例如,黑色PBM 5×5的结构如下所示:
P1
# This is a comment
5 5
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
所以你看它很简单:白色是0,黑色是1.但是,PBM有原始版本,如下所示:
'P4\n# This is a comment\n5 5\n\xf8\xf8\xf8\xf8\xf8'
我该怎么做? PBM格式的描述说:
高度行的栅格,按从上到下的顺序排列.每行是宽度位,打包8到一个字节,用无关位填充行中的最后一个字节.每个位代表一个像素:1为黑色,0为白色.像素的顺序是从左到右.它们在每个文件字节中的存储顺序是最重要的位到最低位.文件字节的顺序是从文件的开头到文件的末尾.
一行图像是水平的.列是垂直的.图像中的像素是正方形且连续的.
我不明白我需要做什么;我怀疑我可能需要使用struct或array.array,但我不确定.我需要你的帮助;你能举一个Python的例子来创建这样的文件吗?
>>> size = (5, 5)
>>> array = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
>>> create_pbm(size, array)
'P4\n5 5\n\xf8\xf8\xf8\xf8\xf8'
我需要一个很好的速度,因为我需要处理更大的图像(例如2000×5000).但问题是我需要使用纯Python,没有ctypes和库.请帮助我,并举例说明如何创建二进制PBM文件?
如果你能告诉我二进制PGM和PPM处理,那将会更加惊人.
谢谢!
解决方法:
我相信这里有很大的改进空间(就效率而言)但是这样做是否正常?
import struct
def create_pbm(size,lst):
out = ['P4\n'+' '.join(map(str,size))+'\n'] #header
for j in xrange(0,len(lst),size[1]):
#single row of data
row = lst[j:j+size[1]]
#padded string which can be turned into a number with `int`
s = ''.join(map(str,row))+'0000000'
#Turn the string into a number and pack it (into unsigned int) using struct.
vals = [struct.pack('B',int(s[i*8:(i+1)*8],2)) for i in xrange(size[0]//8+1) ]
out.append(''.join(vals))
return ''.join(out)
a = [1]*25 #flat black image.
print repr(create_pbm((5,5),a))
编辑
至于阅读,这似乎工作:
def read_pbm(fname):
with open(fname) as f:
data = [x for x in f if not x.startswith('#')] #remove comments
p_whatever = data.pop(0) #P4 ... don't know if that's important...
dimensions = map(int,data.pop(0).split())
arr = []
col_number = 0
for c in data.pop(0):
integer = struct.unpack('B',c)[0]
col_number += 8
bits = map(int,bin(integer)[2:])
arr.extend(bits[:min(8,dimensions[0]-col_number)])
if(col_number > dimensions[0]):
col_number = 0
return (dimensions, arr)
这些文件格式是否必须是正方形的?这似乎不太可能.我很可能在尺寸部分混合了行/列.随意检查;-).
内容总结
以上是互联网集市为您收集整理的python – 创建二进制PBM / PGM / PPM全部内容,希望文章能够帮你解决python – 创建二进制PBM / PGM / PPM所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。