1.图片处理-修改颜色
有时候有种困扰!把网上的截屏,或者一般图片拖到PPT或者其他文档里面去,会有一个明显的白底框框。
放进PPT里面也太丑了点,干脆把图片的白底给弄透明,可就为这下个PS,不符合程序员的风格!
能写代码自动化解决的当然写代码了!
对了,这个还能把手机拍照的---手写签名呀~之类的抠出来放进word也毫无违和感了.
from PIL import Image
def process(self, image_file, old_bk, new_bk, text_color):
'''
将图像特定颜色改为新颜色,前文改为设定颜色或者原始颜色
'''
img = Image.open(image_file).convert("RGBA")
datas = img.getdata()
newData = []
for item in datas:
if self.is_around(item, old_bk):
newData.append(new_bk)
else:
newData.append(text_color if text_color else item)
img.putdata(newData)
return img
process函数主要就是干了一件事:
判断像素RGBA是否在某个值附近——修改颜色,否则保持原色 or 改成你想要的。
按理来说,把一个白色的背景搞成渐变色也可以,只需要old_bk设置为白色的RGBA值,new_bk用个yield不断得到渐变的颜色值就好了。有需要的自己做吧~
2.透明化
def transparent(self, image_file, bk_color, text_color=None):
process(image_file, bk_color, (0, 0, 0, 0), text_color)
就是把process的参数改成需要的,bk_color一般设置为白底(255,255,255,~),后面改变的参数设置为透明(~,~,~,0)
RGBA最后一位表示透明度。text_color 为None 的时候就让图片的前景保持不变。
这样就实现了抠图的效果。比方下面这个的图标,放进PPT里面明显很突兀;抠图完就成这样了,舒服多了~
3.代码
import os
from PIL import Image
class Transcolor():
def __init__(self):
self.color_map = {
'white': (255, 255, 255, 0),
'black': (0, 0, 0, 0),
}
def process(self, image_file, old_bk, new_bk, text_color):
'''
将图像特定颜色改为新颜色,前文改为设定颜色或者原始颜色
'''
img = Image.open(image_file).convert("RGBA")
datas = img.getdata()
newData = []
for item in datas:
if self.is_around(item, old_bk):
newData.append(new_bk)
else:
newData.append(text_color if text_color else item)
img.putdata(newData)
return img
def transparent(self, image_file, bk_color='white', text_color=None):
#透明化
bk = self.formulate(bk_color)
text_color = self.formulate(text_color) if text_color else None
return self.process(image_file, bk, (0, 0, 0, 0), text_color)
def is_around(self, color1, color2):
for i in range(3):
if abs(color1[i] - color2[i]) > 30:
return False
return True
def formulate(self, var): #格式检查
if var in self.color_map.keys():
return self.color_map[var]
for n, i in enumerate(var):
if i < 0 or i > 255 or n >= 4:
print('Error:请输入white|black|phote_w|(220,220,220,0)RGBA形式')
exit(1)
return var
if __name__ == "__main__":
t = Transcolor()
photo_dir = 'res/photo'
for i in os.listdir(photo_dir):
if os.path.splitext(i)[1].lower() in ['.jgp', '.png', '.jpeg', '.bmp']:
path = os.path.join(photo_dir, i)
t.transparent(path).save(path + '.png')