2022年10月最新基于Django3.2.16实现对上传图片加水印

186次阅读
没有评论

共计 1779 个字符,预计需要花费 5 分钟才能阅读完成。

前言

最近这个在 Django 后台上传图片时自动加水印的需求,各种 google 和百度一个能用的都没有,最终在胡阳大神的书《Django 企业开发实战:高效 Python Web 框架 指南》中找到了答案,在此特地感谢,不过大神的代码好像用的是默认字体,最终呈现的效果不太好看,而且水印是在图片的最下方居中显示,也不太符合我们的一般放在右下角的习惯,我优化了一下代码。

实战

以本站的后端 Django 项目为例,假设你的你用 Django 框架的脚手架命令新建的项目叫 DjangoBlog4Life,那么在你的这个目录../DjangoBlog4Life/DjangoBlog4Life 下面新建一个叫 storage.py 的文件放入下面代码:

from io import BytesIO
import os

from django.core.files.storage import FileSystemStorage
from django.core.files.uploadedfile import InMemoryUploadedFile

from PIL import Image, ImageDraw, ImageFont


class WatermarkStorage(FileSystemStorage):
    def save(self, name, content, max_length=None):
        # 处理逻辑
        if 'image' in content.content_type:
            # 加水印
            image = self.watermark_with_text(content, 'https://www.sharpgan.com/', "192,192,192")
            content = self.convert_image_to_file(image, name)

        return super().save(name, content, max_length=max_length)

    def convert_image_to_file(self, image, name):
        temp = BytesIO()
        image.save(temp, format='PNG')
        file_size = temp.tell()
        return InMemoryUploadedFile(temp, None, name, 'image/png', file_size, None)

    def watermark_with_text(self, file_obj, text, color):
        img = Image.open(file_obj)
        size = img.size
        x, y = size[0], size[1]
        #print(x,y)
        draw = ImageDraw.Draw(img)
        font_path = os.path.dirname(os.path.abspath(__file__))
        ttfront = ImageFont.truetype(os.path.join(font_path, 'arial.ttf'), 35)
        text_w, text_h = draw.textsize(text, ttfront)
        xy_coordinate = x-(text_w+10), y-text_h
        rgb_color_str = color.split(',')
        rgb_color = int(rgb_color_str[0]), int(rgb_color_str[1]),int(rgb_color_str[2])
        draw.text(xy_coordinate, text, fill=rgb_color, font=ttfront)
        return img

上述代码已经在 Django 3.2.16 LTS 中亲测可用,需要注意的是需要你自己把代码中的 save() 方法中的水印文字也就是本站的网址 https://www.sharpgan.com/ 自行修改为你想要的,然后就是你自己去 google 或百度搜一个叫 arial.ttf 的字体文件,放到和 storage.py 这个文件同一级目录里面。

最后,在你的 settings.py 中加入下面一行配置即可:

DEFAULT_FILE_STORAGE='DjangoBlog4Life.storage.WatermarkStorage'

下面展示一下成果:

2022 年 10 月最新基于 Django3.2.16 实现对上传图片加水印

如果上述代码有帮助到你的话,不要忘记第一时间评论告诉我哦,我收到邮件通知后会立刻回复你的。

正文完
 
sharp097
版权声明:本站原创文章,由 sharp097 2022-10-18发表,共计1779字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)