ODOO13 有同志留言,想看看图片上传增加水印。今天,他来撩

2024-04-24 09:58

本文主要是介绍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 有同志留言,想看看图片上传增加水印。今天,他来撩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931429

相关文章

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图