首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 打造自己的图床升级篇 - PIL 为图片添加水印

Python 打造自己的图床升级篇 - PIL 为图片添加水印

作者头像
FungLeo
发布于 2019-05-27 00:55:00
发布于 2019-05-27 00:55:00
79601
代码可运行
举报
运行总次数:1
代码可运行

分析情况

如上图中所示,我们直接将读取到的二进制文件,直接存储到了硬盘中。而我们要给图片添加水印,则就是在这里进行处理。

首先,我们需要判断图片是否为 jpg 图片,非 jpg 图片我不准备做添加水印的处理,否则,可能会写坏掉一些 gif 的动图。png 图片在我的博文中使用得也比较少,所以不做处理了。

然后就是,一些过分小的图片,就不要添加水印了,否则有碍图片的观瞻。

另外,还有一个问题是, PILImage.open() 函数,接收的是一个图片的地址,而我这边是已经拿到了图片的二进制,并且存在了内存中。我一开始想,莫非需要我先保存到硬盘,然后读取到 PIL 中,进行水印处理,然后再一次写入硬盘。

但是,我个人认为这个逻辑虽然说不是不可以,但是在我看来比较蠢。我希望在内存中直接解决,然后一次性存储到硬盘,因此,我找到了 BytesIO 这个可爱的方法。

最终代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from sanic import Sanic
from sanic.response import json, text, file
import os, sys
import hashlib
from PIL import Image
from io import BytesIO

app = Sanic()
baseDir = '/Users/fungleo/Documents/Blog/articles/image/'

# 成功以及失败的返回脚本
def ok(data):
    return json({"data": data, "status": 0})

def fail(data):
    return json({"data": data, "status": 1})

# 字节码转16进制字符串
def bytes2hex(bytes):
    hexstr = u""
    for i in range(10):
        t = u"%x" % bytes[i]
        if len(t) % 2:
            hexstr += u"0"
        hexstr += t
    return hexstr.lower()

# 根据16进制字符串获取文件后缀
def getSuffix(hexStr):
    print(hexStr)
    SUPPORT_TYPE = {
            'ffd8ffe':'jpg',
            '89504e470d0a1a0a0000':'png',
            '474946383961':'gif',
        }
    for i in SUPPORT_TYPE:
        if i in hexStr:
            return SUPPORT_TYPE[i]
    return 'error type'

def saveImage(savePath, image):
    tempFile = open(savePath, 'wb')
    tempFile.write(image)
    tempFile.close()

# 上传文件接口
@app.route('/upimg', methods=['POST'])
async def upimg(request):

    # 判断参数是否正确
    if not request.files and not request.files.get('file'):
        return fail('error args')
    image = request.files.get('file').body

    # 判断文件是否支持
    imageSuffix = getSuffix(bytes2hex(image))
    if 'error' in imageSuffix:
        return fail(imageSuffix)

    # 组织图片存储路径
    m1 = hashlib.md5()
    m1.update(image)
    md5Name = m1.hexdigest()

    saveDir = baseDir + md5Name[0:2] + '/'
    savePath = saveDir + md5Name[2:] + '.' + imageSuffix
    resPath = '/' + md5Name[0:2] + '/' + md5Name[2:] + '.' + imageSuffix

    # 如果文件夹不存在,就创建文件夹
    if not os.path.exists(saveDir):
        os.makedirs(saveDir)

    # 如果是 jpg 图片,则添加水印
    if imageSuffix == 'jpg':
        bImg = BytesIO(image)
        img = Image.open(bImg)
        imgW = img.size[0]
        imgH = img.size[1]

        if imgW >= 300 and imgH >= 100:
            mark = Image.open("mark.png")
            layer = Image.new('RGBA', img.size, (0,0,0,0))
            layer.paste(mark, (imgW - 180, imgH - 60))
            out = Image.composite(layer, img, layer)
            out.save(savePath, 'JPEG', quality = 100)
        else:
            saveImage(savePath, image)

    # 否则直接将文件写入到硬盘
    else:
        saveImage(savePath, image)

    # 给客户端返回结果
    return ok({"path": resPath})

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=7000)

因为需要经过两次判断,else 时都是直接写入硬盘,因此,将原来的写入硬盘的方法直接封装为一个函数。

如上,当图片尺寸小于 300*100 的时候,就不添加水印了。

关键是,直接保存图片的话,图片的存储质量并不是很好,因此,我加上了指定质量为 100

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年07月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小型 LLM 与边缘推理:模型压缩与 on‑device 部署实践
近年来,大型语言模型(LLM)不断推动人工智能能力向前发展,但其庞大的参数规模和计算资源要求限制了其在边缘设备(如手机、嵌入式系统、IoT 设备)上的部署。随着模型压缩、量化和高效推理引擎的发展,小型 LLM 的 on-device 部署逐渐成为可能。
一键难忘
2025/07/24
1230
从零到一使用 Ollama、Dify 和 Docker 构建 Llama 3.1 模型服务
本篇文章聊聊,如何使用 Ollama、Dify 和 Docker 来完成本地 Llama 3.1 模型服务的搭建。
soulteary
2024/07/28
2.4K0
从零到一使用 Ollama、Dify 和 Docker 构建 Llama 3.1 模型服务
Ollama 升级!支持一键拉取Huggingface上所有的模型,太方便了!(vLLM、Fastgpt、Dify、多卡推理)
我记得,梦的开始,源于Ollama。很早以前的一篇文章教大家如何通过 Ollama 来使用开源 LLM,许多人最初接触 AI 时也是从Ollama开始的。Ollama 之所以出色,是因为它使用了 GGML 格式,这是一种‘轻量版’的大语言模型,以较低精度运行,能够轻松适配普通硬件。这使得在本地系统上运行这些模型变得简单高效,真正为 AI 的广泛应用铺平了道路。
AI进修生
2024/12/02
17.7K0
Ollama 升级!支持一键拉取Huggingface上所有的模型,太方便了!(vLLM、Fastgpt、Dify、多卡推理)
手把手带你3步本地私有化部署DeepSeekR1,亲测成功
DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型,具备数学推理、代码生成等深度能力,堪称"AI界的六边形战士"。
烟雨平生
2025/02/10
8.3K0
手把手带你3步本地私有化部署DeepSeekR1,亲测成功
CPU 混合推理,非常见大模型量化方案:“二三五六” 位量化
本篇文章聊聊网上聊的比较少的具体量化操作,非常见整型位数的量化,来自让各种开源模型能够在 CPU 环境、CPU & GPU 环境混合推理的技术方案:llama.cpp 。
soulteary
2023/12/14
1.2K1
CPU 混合推理,非常见大模型量化方案:“二三五六” 位量化
llama.cpp在各个操作系统本地编译流程
The following sections describe how to build with different backends and options.
云未归来
2025/07/16
1600
LLM 大模型学习必知必会系列(六):量化技术解析、QLoRA技术、量化库介绍使用(AutoGPTQ、AutoAWQ)
模型的推理过程是一个复杂函数的计算过程,这个计算一般以矩阵乘法为主,也就是涉及到了并行计算。一般来说,单核CPU可以进行的计算种类更多,速度更快,但一般都是单条计算;而显卡能进行的都是基础的并行计算,做矩阵乘法再好不过。如果把所有的矩阵都加载到显卡上,就会导致显卡显存的占用大量增加,尤其是LLM模型大小从7b、14b、34b到几百b不等,占用显存的大小就是惊人的数字,如何在减少运算量和显存占用的条件下,做到推理效果不下降太多呢?在这里需要引入浮点数和定点数的概念。
汀丶人工智能
2024/05/26
2.5K0
LLM 大模型学习必知必会系列(六):量化技术解析、QLoRA技术、量化库介绍使用(AutoGPTQ、AutoAWQ)
LLM大模型部署实战指南:Ollama简化流程,OpenLLM灵活部署,LocalAI本地优化,Dify赋能应用开发
Ollama 是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。,这是 Ollama 的官网地址:https://ollama.com/
汀丶人工智能
2024/08/17
1.6K0
LLM大模型部署实战指南:Ollama简化流程,OpenLLM灵活部署,LocalAI本地优化,Dify赋能应用开发
【大模型实战】 Ollama部署满血量化版的DeepSeek R1模型(671B)
选择ollama-linux-amd64.tgz文件,如果下载慢,可以将连接放到迅雷里面提升下载速度。
AI浩
2025/02/18
1.4K1
【大模型实战】 Ollama部署满血量化版的DeepSeek R1模型(671B)
CPU 混合推理,非常见大模型量化方案:“二三五六” 位量化
本篇文章聊聊网上聊的比较少的具体量化操作,非常见整型位数的量化,来自让各种开源模型能够在 CPU 环境、CPU & GPU 环境混合推理的技术方案:llama.cpp 。
soulteary
2023/12/12
1.7K0
探秘NVIDIA RTX AI:llama.cpp如何让你的Windows PC变身AI超人
想象一下,你的Windows PC突然拥有了超能力,能够迅速处理复杂的AI任务,就像电影里的超级电脑一样。这一切,都要归功于NVIDIA RTX AI平台和它的秘密武器——llama.cpp!
GPUS Lady
2024/10/04
1K0
一文读懂本地运行 LLM 的最佳实践方法
众所周知,如今使用 ChatGPT 等大型模型工具变得异常简单,只需通过浏览器在线访问即可。然而,需要注意的是,这种方式可能对我们的隐私和数据造成一些潜在影响,这一点需要格外小心。像主流的 OpenAI 等平台会存储我们所构建的提示、响应以及其他元数据,以便重新训练模型。虽然对于某些人来说这并不构成问题,但注重隐私的人往往更倾向于在本地使用这些模型,以确保在交互过程中没有任何外部跟踪的情况下保护隐私。
Luga Lee
2024/11/01
5360
一文读懂本地运行 LLM 的最佳实践方法
LLM运行框架对比:ollama与vllm浅析
开源的LLM已经成为程序员、爱好者和希望在日常工作中使用生成式AI并保持隐私的用户的最佳选择,对于企业的私有化部署而言也是如此。这些模型提供了优秀的性能,有时在许多任务中可以与大型的闭源模型 (如 GPT-4o 或 Claude Sonnet 3.5) 相媲美。
半吊子全栈工匠
2025/03/10
2.1K1
LLM运行框架对比:ollama与vllm浅析
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
Xorbits Inference (Xinference) 是一个开源平台,用于简化各种 AI 模型的运行和集成。借助 Xinference,您可以使用任何开源 LLM、嵌入模型和多模态模型在云端或本地环境中运行推理,并创建强大的 AI 应用。通过 Xorbits Inference,可以轻松地一键部署你自己的模型或内置的前沿开源模型
汀丶人工智能
2024/08/17
6.9K0
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
Ollama如何构建自己的Llama3中文模型模型
Ollama 是一个开源的大型语言模型(LLM)服务工具,它允许用户在本地机器上运行和部署大型语言模型。Ollama 设计为一个框架,旨在简化在 Docker 容器中部署和管理大型语言模型的过程,使得这一过程变得简单快捷。用户可以通过简单的命令行操作,快速在本地运行如 Llama 3 这样的开源大型语言模型。
Tinywan
2024/05/20
1.1K0
Ollama如何构建自己的Llama3中文模型模型
在Windows电脑上快速运行AI大语言模型-Llama3
近期 Meta 发布了最新的 Llama3 模型,并开源了开源代码。Meta Llama 3 现已推出 8B 和 70B 预训练和指令调整版本,可支持广泛的应用程序。
东风微鸣
2024/04/23
1.8K0
在Windows电脑上快速运行AI大语言模型-Llama3
构建能够使用 CPU 运行的 MetaAI LLaMA2 中文大模型
本篇文章聊聊如何使用 GGML 机器学习张量库,构建让我们能够使用 CPU 来运行 Meta 新推出的 LLaMA2 大模型。
soulteary
2023/07/24
1.2K0
本地CPU上运行LLM,1毛钱都不想多花
如果你和我一样,最近一直在做Agent试探,就会对第三方大模型非常纠结,随着调用次数的增加,银子也是白花花的流淌,有没有省钱的办法呢?当然有,就是在CPU上跑大模型。
否子戈
2024/04/12
8320
本地CPU上运行LLM,1毛钱都不想多花
构建能够使用 CPU 运行的 MetaAI LLaMA2 中文大模型
本篇文章聊聊如何使用 GGML 机器学习张量库,构建让我们能够使用 CPU 来运行 Meta 新推出的 LLaMA2 大模型。
soulteary
2023/09/04
9820
构建能够使用 CPU 运行的 MetaAI LLaMA2 中文大模型
用 Ollama 打造你的本地 AI 小助手:LLaMA / Mistral 部署全流程
而搭配 Open WebUI,你可以获得近似 ChatGPT 的 Web 聊天界面👇:
默 语
2025/04/25
6210
推荐阅读
小型 LLM 与边缘推理:模型压缩与 on‑device 部署实践
1230
从零到一使用 Ollama、Dify 和 Docker 构建 Llama 3.1 模型服务
2.4K0
Ollama 升级!支持一键拉取Huggingface上所有的模型,太方便了!(vLLM、Fastgpt、Dify、多卡推理)
17.7K0
手把手带你3步本地私有化部署DeepSeekR1,亲测成功
8.3K0
CPU 混合推理,非常见大模型量化方案:“二三五六” 位量化
1.2K1
llama.cpp在各个操作系统本地编译流程
1600
LLM 大模型学习必知必会系列(六):量化技术解析、QLoRA技术、量化库介绍使用(AutoGPTQ、AutoAWQ)
2.5K0
LLM大模型部署实战指南:Ollama简化流程,OpenLLM灵活部署,LocalAI本地优化,Dify赋能应用开发
1.6K0
【大模型实战】 Ollama部署满血量化版的DeepSeek R1模型(671B)
1.4K1
CPU 混合推理,非常见大模型量化方案:“二三五六” 位量化
1.7K0
探秘NVIDIA RTX AI:llama.cpp如何让你的Windows PC变身AI超人
1K0
一文读懂本地运行 LLM 的最佳实践方法
5360
LLM运行框架对比:ollama与vllm浅析
2.1K1
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
6.9K0
Ollama如何构建自己的Llama3中文模型模型
1.1K0
在Windows电脑上快速运行AI大语言模型-Llama3
1.8K0
构建能够使用 CPU 运行的 MetaAI LLaMA2 中文大模型
1.2K0
本地CPU上运行LLM,1毛钱都不想多花
8320
构建能够使用 CPU 运行的 MetaAI LLaMA2 中文大模型
9820
用 Ollama 打造你的本地 AI 小助手:LLaMA / Mistral 部署全流程
6210
相关推荐
小型 LLM 与边缘推理:模型压缩与 on‑device 部署实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档