本文主要是介绍ODOO13 有同志留言,想看看图片上传增加水印。今天,他来撩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
图片上传增加水印,本文使用Python第三方库 PIL 实现上传图片增加水印。本文只说明如何将odoo中的图片,转化为二进制的形式,并在二进制数据流的基础上使用PIL库,为图片增加水印,并不代表任何实际业务。
为了演示,我假定模型下有如下Image类型的字段:
class Test(models.Model):_name = 'test.test'_description = 'demo'image_1920 = fields.Image(default=_default_image)
在xml中显示:
<field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
为了在创建或修改次图片字段时,都能进行增加水印的处理,我将处理功能增加到 onchange 事件中。在开始处理图片之前,你需要做如下准备:
1、安装PIL库:
pip3 install pillow
2、下载一个字体包,把它放到static/src/fonts文件夹下,保证此字体兼容中英文,不会出现乱码就可以,我使用的汉体。
链接: https://pan.baidu.com/s/1zdNGonN35WeEROk22NZa_Q 提取码: gsmb
文字水印
对图片增加文字水印的大体思路,是将文字做成一张背景透明的图片,然后与原图片合成。
from odoo import models, fields, api
import base64
from io import BytesIO
import io
from PIL import Image, ImageFont, ImageDraw
from odoo.modules.module import get_module_resourceclass Test(models.Model):_name = 'test.test'_description = 'demo'image_1920 = fields.Image(default=_default_image)@api.onchange("image_1920")def onchange_image_by(self):if self.image_1920:# 默认文字水印,如果没有配置文字,将使用此文字default_font_txt = "HELLO WORLD" # 配置的文字水印font_txt = self.env['ir.config_parameter'].sudo().get_param('product.watermark', default_font_txt) font_path = get_module_resource('test_water_mark', 'static/src/fonts', 'ht.ttc')image = Image.open(BytesIO(base64.b64decode(self.image_1920))).convert('RGBA')# 为文字创建图片txt = Image.new('RGBA', image.size, (0, 0, 0, 0))font_size = int(txt.size[0] / 10)font_obj = ImageFont.truetype(font_path, font_size)draw = ImageDraw.Draw(txt)text_size_x, text_size_y = draw.textsize(font_txt, font=font_obj)draw.text(((txt.size[0] - text_size_x) / 2, (txt.size[1] - text_size_y) / 2),font_txt, font=font_obj, fill=(255, 255, 255, 150))# 合并原图与文字图片out = Image.alpha_composite(image, txt)out = out.convert('RGB')stream = io.BytesIO()out.save(stream, format="PNG")self.write({"image_1920": base64.b64encode(stream.getvalue())})else:pass
实现onchage部分的代码,就已经实现图片增加文字水印的功能了。在上面的代码中,你可能注意到了如下代码:
font_txt = self.env['ir.config_parameter'].sudo().get_param('product.watermark', default_font_txt)
我为了不将水印的文字内容写死,特意在系统参数中定义了一个参数键值对,创建文件 /data/data.xml 并在manifest中引用。这样的话,用户就可以在系统参数里设置文字水印的内容并使用自己定义的文字了:
<?xml version="1.0" encoding="utf-8"?>
<odoo><data noupdate="1"><record model="ir.config_parameter" id="watermark" ><field name="key">product.watermark</field><field name="value">ZERONE</field></record></data>
</odoo>
然后就是如何加载odoo目录下的静态文件(字体包)了,odoo 提供了访问静态资源文件的方法 get_module_resource,但需要你导入这个方法:
from odoo.modules.module import get_module_resource
使用它时,为这个方法提供几个参数,第一个参数是模块名,第二个是存放路径,第三个是文件名:
font_path = get_module_resource('test_water_mark', 'static/src/fonts', 'ht.ttc')
接下来,就是如何将字段 image_1920 转化为Image可识别的流?一般情况下,兄弟们都是从某路径下拿到一张图片,然后将其进行open操作,但有些情况下,我们直接拿到的是二进制数据,而并不是一张已经存在的图片,而我们又不想先将数据转存成一张图片临时存储到服务器的某个角落。怎么办?如果有个东西 能直接在内存中读写二进制数据 就好了。所以BytesIO来了。
image = Image.open(BytesIO(base64.b64decode(self.image_1920))).convert('RGBA')
接下来,就是创建一张背景透明的文字图片,并与原图片合成最终带水印的图片。使用io.BytesIO转为二进制流,给image_1920 字段赋值。
图片水印
图片水印的实现,与文字水印类似,也可以说两种实现就是一种实现,图片水印的实现,简单写个例子吧。下面这个例子,我为了省时,就不创建配置图片水印的视图了,图片水印我使用公司logo。当然,你也可以在模块中,增加一个图片作为默认水印图片,访问静态资源的方法已再上面例子中说明了,此处我省略了。
就在此处上传公司logo,使用logo 作为图片水印,下面是处理代码:
@api.onchange("image_1920")def onchange_image_by(self):if self.image_1920:image = Image.open(BytesIO(base64.b64decode(self.image_1920)))logo_as_mask = Image.open(BytesIO(base64.b64decode(self.env["res.company"].sudo().search([],limit=1).logo)))image_size = image.sizelogo_as_mark_size = logo_as_mask.size# 缩放到原图的60%scale = min(int(image_size[0] * 0.6 / logo_as_mark_size[0]), int(image_size[1] * 0.6 / logo_as_mark_size[1]))new_size = (int(logo_as_mark_size[0] * scale), int(logo_as_mark_size[1] * scale))new_mask = logo_as_mask.resize(new_size, resample=Image.ANTIALIAS)# 合并图片image.paste(new_mask, (int((image_size[0] - new_size[0]) / 2), int((image_size[1] - new_size[1]) / 2)), new_mask)stream = io.BytesIO()image.save(stream, format=image.format)self.write({"image_1920": base64.b64encode(stream.getvalue())})else:pass
这次合并图片使用了paste,感兴趣的可以去了解Pil库。下面是实现的效果:
这篇关于ODOO13 有同志留言,想看看图片上传增加水印。今天,他来撩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!