Python Lab 11.15 ~

Question-1:
光棍的悲伤:光棍们对1总是那么敏感,因此每年的11.11被戏称为光棍节。让我们勇敢面对光棍的身份吧,现在就证明自己:给你一个整数a,数出a在二进制表示下1的个数,并输出。
Question-2:
马赛克:As an old saying goes,”马赛克是阻碍人类进步的阶梯”,python就是创造这个阶梯的作案工具之一,现在你需要利用这个作案工具,为指定图片的相应区域打上马赛克。
Question-3:
奇怪的马赛克(附加题):通常意义下,马赛克是由若干个小正方形组成的,如果你能把马赛克变成一个三角形、圆或者其他的比较复杂的几何形状,让艺术的魅力充斥其中,并获得他人的认可,将会获得额外的加分。

Answer-1:
由于bin不能用,在这里我直接做了一个转2进制的代码..

# 2013.11.15 by Alex YU

def divide(x):
        result = ''
        x = int(x)
        while x > 0:
                mod = x % 2
                x /= 2
                result = str(mod) + result
        return result

def main():
	a = input('Num = ')
	print divide(a).count('1')

main()
#
# 2013.11.15 by Alex YU
#  can't be used here.. cos it's to easy
print bin(4).count('1')
#

Answer-2:
详见我的另一篇blog——《PIL mosaic 传说中的打码~

Answer-3:
这是附加题,打码的代码,我做了一个根据区域灰度匹配不同颜色阶梯的透明边小方块(其实就是预设好的小图片将原图拼出来)的代码
又忘了专业术语了,forgive me..略高端的样子 ~ ~
这里略不智能因为只能匹配20×20 pixel的方块,而且这里只取了8个等级的渐变色,whatever,程序的核心有了就行
当然网上很多骰子作画,符号作画,图片作画等等其实都差不多~

方块——blocks

# 2013.11.15 by Alex YU
# map the picture!

import Image
im = Image.open('/home/tro/b.jpg')
(pic_w,pic_h) = im.size

def divide(w,h,s):
	boxes = [(x,y,x+s,y+s) for x in range(0,w,s) for y in range(0,h,s)]
	for box in boxes:
		snip = im.crop(box)
		yield snip,box

def avg_clr(p):
	c = list(p.getdata())
	q = sum(c)/len(c)
	return q

def main():
	for a in divide(pic_w,pic_h,20):
		snip,box = a
		for grey in range(0,256,32):
			if grey<=avg_clr(snip.convert('L'))<grey+32:
				x = '/home/tro/pp/p'+str(grey/32)+'.png'
				xx = Image.open(x)
				im.paste(xx,box)

	im.show()
#	im.save('/home/tro/output.png')

main()
#
输入图片,,如若侵权contact me!
输入图片,<”RGB”,JPEG,3200×2000>,如若侵权contact me!
输出图片20×20点阵,
输出图片20×20点阵,<”RGB”,PNG>

Ps:
1. 待解决问题,本来是有透明边的PNG,结果处理完了之后的PNG居然直接变白色了,这里需要google,估计是PIL Image的问题(是不是不是”RGBA”所以…)
2. 上面输出图片已经是”RGBA”文件了,颜色方块之间是透明的喔

Aha,搞掂,果然是Alpha channel的问题,so这里要新合成一个图片咯,改进代码如下

# 2013.11.22 by Alex YU

import Image
im = Image.open('/home/tro/b1.jpg')
(pic_w,pic_h) = im.size
oput = Image.new('RGBA',im.size)

def divide(w,h,s):
	boxes = [(x,y,x+s,y+s) for x in range(0,w,s) for y in range(0,h,s)]
	for box in boxes:
		snip = im.crop(box)
		yield snip,box

def avg_clr(p):
	c = list(p.getdata())
	q = sum(c)/len(c)
	return q

def main():
	for a in divide(pic_w,pic_h,20):
		snip,box = a
		for grey in range(0,256,32):
			if grey&lt;=avg_clr(snip.convert('L'))&lt;grey+32:
				path = '/home/tro/pp/p'+str(grey/32)+'.png'
				block = Image.open(path)
				oput.paste(block,box,block)

#	print oput.mode		
#	oput.show()
	oput.save('/home/tro/output.png')

main()
#

发表评论

电子邮件地址不会被公开。 必填项已用*标注