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

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

恶意PNG:隐藏在图片中的“恶魔”

&lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/bffb187dc3546c6c5c6b8aa18b34b962.jpeg&quot; title=&quot;214201hhuuhubsuyuukbfy_meitu_1_meitu_2.jpg&quot;/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;

PHP抓取网站图片脚本

方法一: <?phpheader("Content-type:image/jpeg"); class download_image{function read_url($str) { $file=fopen($str,"r");$result = ''; while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); re

在SSH的基础上使用jquery.uploadify.js上传文件

在SSH框架的基础上,使用jquery.uploadify.js实现文件的上传,之前搞了好几天,都上传不了, 在Action那边File接收到的总是为null, 为了这个还上网搜了好多相关的信息,但都不行,最后还是搜到一篇文章帮助到我了,希望能帮助到为之困扰的人。 jsp页面的关键代码: <link rel="stylesheet" type="text/css" href="${page

(入门篇)JavaScript 网页设计案例浅析-简单的交互式图片轮播

网页设计已经成为了每个前端开发者的必备技能,而 JavaScript 作为前端三大基础之一,更是为网页赋予了互动性和动态效果。本篇文章将通过一个简单的 JavaScript 案例,带你了解网页设计中的一些常见技巧和技术原理。今天就说一说一个常见的图片轮播效果。相信大家在各类电商网站、个人博客或者展示页面中,都看到过这种轮播图。它的核心功能是展示多张图片,并且用户可以通过点击按钮,左右切换图片。