python输出图形效果的代码_Python3.6实现编码图像(ppm和jpg)的输出

import numpy as np

from PIL import Image

import sys

# 异常

class StringError(Exception):

def __init__(self,err):

Exception.__init__(self)

self.err=err

def getNRZ(binum,line_pixes=3,bi_pixes=90,pic_height=400,y_max=350,y_min=50):

"""反向不归零编码(NRZ)binum:输入的二进制码line_pixes:线的宽度(像素);bi_pixes:1位编码的宽度;pic_height图片高;y_max:线的最高点;y_min线的最低点"""

last_bi = '2' #存储上一次数据,2表示刚开始

pic_np = np.ones((bi_pixes * (len(binum)+1),pic_height),dtype=np.int)

for index,item in enumerate(binum):

try:

if last_bi != item and last_bi != 2:

pic_np[(index*bi_pixes - line_pixes):(index*bi_pixes + line_pixes),y_min:y_max]=0

if item == '1':# 1划横线

pic_np[index*bi_pixes:(index+1)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)]=0

last_bi = '1'

elif item == '0':

pic_np[index*bi_pixes:(index+1)*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)]=0

last_bi = '0'

else:

raise StringError('\r\n!!! ERROR !!! : Your binary string is NOT 0 or 1')

except StringError as var:

print(var.err)

sys.exit()

return pic_np

def getManchester(binum,line_pixes=3,bi_pixes=90,pic_height=400,y_max=350,y_min=50):

"""曼彻斯特(Manchester)编码binum:输入的二进制码line_pixes:线的宽度(像素);bi_pixes:1位编码的宽度;pic_height图片高;y_max:线的最高点;y_min线的最低点"""

last_bi = '2' #存储上一次数据,2表示刚开始

pic_np = np.ones((bi_pixes * (len(binum)+1),pic_height),dtype=np.int8)

for index,item in enumerate(binum):

try:

if last_bi == item and last_bi != '2':

pic_np[(index*bi_pixes - line_pixes):(index*bi_pixes + line_pixes),y_min:y_max]=0

if item == '1':# 1划横线

pic_np[index*bi_pixes:(2*index+1)*bi_pixes//2,(y_max-line_pixes):(y_max+line_pixes)]=0

pic_np[(2*index+1)*bi_pixes//2:(index+1)*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)]=0

pic_np[((2*index+1)*bi_pixes//2 - line_pixes):((2*index+1)*bi_pixes//2 + line_pixes),y_min:y_max]=0

last_bi = '1'

elif item == '0':

pic_np[index*bi_pixes:(2*index+1)*bi_pixes//2,(y_min-line_pixes):(y_min+line_pixes)]=0

pic_np[(2*index+1)*bi_pixes//2:(index+1)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)]=0

pic_np[((2*index+1)*bi_pixes//2 - line_pixes):((2*index+1)*bi_pixes//2 + line_pixes),y_min:y_max]=0

last_bi = '0'

else:

raise StringError('\r\n!!! ERROR !!! : Your binary string is NOT 0 or 1')

except StringError as var:

print(var.err)

sys.exit()

return pic_np

def getDBP(binum,line_pixes=3,bi_pixes=90,pic_height=400,y_max=350,y_min=50):

"""差动双相(DBP)编码binum:输入的二进制码line_pixes:线的宽度(像素);bi_pixes:1位编码的宽度;pic_height图片高;y_max:线的最高点;y_min线的最低点"""

last_level = 0 #存储上一次最后的电平,0表示刚开始

pic_np = np.ones((bi_pixes * (len(binum)+1),pic_height),dtype=np.int8)

for index,item in enumerate(binum):

try:

if item == '1':# 1划横线

if last_level == 0:

pic_np[index*bi_pixes:(index+1)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0

last_level = 1

else :

pic_np[index*bi_pixes:(index+1)*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0

last_level = 0

elif item == '0':

if last_level == 0:

pic_np[index*bi_pixes:(2*index+1)*bi_pixes//2,(y_max-line_pixes):(y_max+line_pixes)] = 0

pic_np[(2*index+1)*bi_pixes//2:(index+1)*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0

pic_np[((2*index+1)*bi_pixes//2 - line_pixes):((2*index+1)*bi_pixes//2 + line_pixes),y_min:y_max] = 0

last_level = 0

else :

pic_np[index*bi_pixes:(2*index+1)*bi_pixes//2,(y_min-line_pixes):(y_min+line_pixes)] = 0

pic_np[(2*index+1)*bi_pixes//2:(index+1)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0

pic_np[((2*index+1)*bi_pixes//2 - line_pixes):((2*index+1)*bi_pixes//2 + line_pixes),y_min:y_max] = 0

last_level = 1

else:

raise StringError('\r\n!!! ERROR !!! : Your binary string is NOT 0 or 1')

except StringError as var:

print(var.err)

sys.exit()

pic_np[((index+1)*bi_pixes- line_pixes):((index+1)*bi_pixes + line_pixes),y_min:y_max] = 0

return pic_np

def getPIE(binum,line_pixes=2,bi_pixes=40,pic_height=200,y_max=150,y_min=50):

"""PIE编码binum:输入的二进制码line_pixes:线的宽度(像素);bi_pixes:1位编码的宽度;pic_height图片高;y_max:线的最高点;y_min线的最低点"""

Tari = 16 # 电平周期个数,加上SOF和EOF

for item in binum:

Tari += (int(item)+1)*2

pic_np = np.ones((bi_pixes * (Tari+1),pic_height),dtype=np.int8)

# SOF

pic_np[0:line_pixes,y_min:y_max] = 0

pic_np[0:bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0

pic_np[bi_pixes-line_pixes:bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[bi_pixes:2*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0

pic_np[2*bi_pixes-line_pixes:2*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[2*bi_pixes:3*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0

pic_np[3*bi_pixes-line_pixes:3*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[3*bi_pixes:8*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0

pic_np[8*bi_pixes-line_pixes:8*bi_pixes+line_pixes,y_min:y_max] = 0

# 0和1

idx = 8 #用于保存运行完高低电平后的下标

for index,item in enumerate(binum):

try:

if item == '1':# 1划横线

pic_np[idx*bi_pixes-line_pixes:idx*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[(1+idx)*bi_pixes-line_pixes:(1+idx)*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[(4+idx)*bi_pixes-line_pixes:(4+idx)*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[idx*bi_pixes:(1+idx)*bi_pixes,y_min-line_pixes:y_min+line_pixes] = 0

pic_np[(1+idx)*bi_pixes:(4+idx)*bi_pixes,y_max-line_pixes:y_max+line_pixes] = 0

idx += 4

elif item == '0':

pic_np[idx*bi_pixes-line_pixes:idx*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[(1+idx)*bi_pixes-line_pixes:(1+idx)*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[(2+idx)*bi_pixes-line_pixes:(2+idx)*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[idx*bi_pixes:(1+idx)*bi_pixes,y_min-line_pixes:y_min+line_pixes] = 0

pic_np[(1+idx)*bi_pixes:(2+idx)*bi_pixes,y_max-line_pixes:y_max+line_pixes] = 0

idx += 2

else:

raise StringError('\r\n!!! ERROR !!! : Your binary string is NOT 0 or 1')

except StringError as var:

print(var.err)

sys.exit()

# EOF

pic_np[idx*bi_pixes-line_pixes:idx*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[idx*bi_pixes:idx*bi_pixes+bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0

pic_np[idx*bi_pixes+bi_pixes-line_pixes:(idx+1)*bi_pixes+line_pixes,y_min:y_max] = 0

pic_np[(idx+1)*bi_pixes:(idx+8)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0

return pic_np

# 输入二进制

binum = input("Please input your binary string: ")

print("You input\""+binum+"\"")

## NRZ

img = Image.fromarray(getNRZ(binum).T*255.0)

img = img.convert('L')

img = img.transpose(Image.FLIP_TOP_BOTTOM)

img.save('NRZ.ppm')

img.save('NRZ.jpg')

img.show()

##Manchester

img = Image.fromarray(getManchester(binum).T*255.0)

img = img.convert('L')

img = img.transpose(Image.FLIP_TOP_BOTTOM)

img.save('Manchester.ppm')

img.save('Manchester.jpg')

img.show()

##DBP

img = Image.fromarray(getDBP(binum).T*255.0)

img = img.convert('L')

img = img.transpose(Image.FLIP_TOP_BOTTOM)

img.save('DBP.ppm')

img.save('DBP.jpg')

img.show()

#PIE

img = Image.fromarray(getPIE(binum).T*255.0)

img = img.convert('L')

img = img.transpose(Image.FLIP_TOP_BOTTOM)

img.save('PIE.ppm')

img.save('PIE.jpg')

img.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值