900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 【python-小工具-3】抠图-透明化背景-修改图片颜色

【python-小工具-3】抠图-透明化背景-修改图片颜色

时间:2019-11-17 07:42:02

相关推荐

【python-小工具-3】抠图-透明化背景-修改图片颜色

1.图片处理-修改颜色

有时候有种困扰!把网上的截屏,或者一般图片拖到PPT或者其他文档里面去,会有一个明显的白底框框。

放进PPT里面也太丑了点,干脆把图片的白底给弄透明,可就为这下个PS,不符合程序员的风格!

能写代码自动化解决的当然写代码了!

对了,这个还能把手机拍照的---手写签名呀~之类的抠出来放进word也毫无违和感了.

from PIL import Imagedef 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的时候就让图片的前景保持不变。

这样就实现了抠图的效果。比方下面这个CSDN的图标,放进PPT里面明显很突兀;抠图完就成这样了,舒服多了~

3.代码

import osfrom PIL import Imageclass 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 imgdef 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 Nonereturn 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 Falsereturn Truedef 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 varif __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')

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。