PythonTip >> 博文 >> 杂项其他

用 pypng 抽离 png 图片的 alpha 通道

zihua 2013-09-26 01:09:36 点击: 1451 | 收藏


这两天遇到制作原型alpha通道的问题,要在一个背景上面用程序把美工给的原型轮廓的图贴到屏幕上。美工制作原型遮罩的方法,大体上都是把某个通道的图加深,变成灰度,或者选择轮廓保存成通道等。这些方法都涉及到颜色加深,变化,做出来的效果和原图在理论上应该是有不吻合的地方的,我们实际测试就发现有漏白点的问题。

我自己发现fireworks有一个滤镜--“转换成alpha”挺不错的,转换出来的alpha灰度图,作为遮罩来画,能够达到平滑的效果,但问题是这个alpha是有透明度的,使得图片变得很淡。

一直都知道最正确的办法是想办法把图片的透明效果,抽离成alpha通道,可是美工做出来的图都是不带alpha通道的,而是32位色带alpha字节的格式,photoshop,fireworks里面都找不到办法抽离出来,和美工解释也听不懂。。

在抓狂之际,想起了libpng,就用pypng来对美工给的png图片进行alpha通道抽离,过程很简单,抽离出来的图片保存成bmp以后,实际使用达到了和png一样的效果。

抽离的程序如下:

#-*- coding:gbk -*-
import png, urllib

def split_main_mask(orig_file):

mask_file = orig_file + '-mask.png'
main_file = orig_file + '-main.png'

r = png.Reader(file=open(orig_file,'rb'))
#print r.asRGBA()
pic = r.read()
pixels = pic[2]
w, h = pic[0], pic[1]

print 'pic info', pic
#print help(pixels)

m = [] # mask
m1 = [] # RGB

count = 0
for line in pixels:
#print line
count += 1
#print 'line len', len(line)

l = []
l2 = []
j = 0
while j+3 < len(line):
l.append(line[j + 3])
l2.append(line[j+0])
l2.append(line[j+1])
l2.append(line[j+2])
j += 4
m.append(l)
m1.append(l2)

#print count

'''
for i in range(h):
for j in range(w):
print m[i][j],
print
'''

#print help(png.Writer)
# write mask
f = open(mask_file, 'wb')
writer = png.Writer(w,h,greyscale=True,bitdepth=8)
writer.write(f, m)
f.close()

#write main
f = open(main_file, 'wb')
writer = png.Writer(w,h)
writer.write(f, m1)
f.close()

print '%s was split to %s %s' % (orig_file, main_file, mask_file)

if _name_ == '_main_':
import sys
if len(sys.argv) < 2:
print 'Usage: %s orig_file' % (sys.argv[0],)
sys.exit( 1 )
split_main_mask(sys.argv[1])

# 注:主要看思路和步骤,以上代码可能会因为格式等问题不能正常运行

原文链接:http://www.simple-is-better.com/news/281

作者:zihua | 分类: 杂项其他 | 标签: png 图片处理 pypng | 阅读: 1451 | 发布于: 2013-09-26 01时 |