压缩图片并添加水印demo
-
导入我们需要的库
# 导入图片库 # 绘画库 from PIL import ImageDraw # 字体库 from PIL import ImageFont # 图片库 from PIL import Image import cv2 # 导入上传文件夹配置 from mydjango.settings import UPLOAD_ROOT import os # 导入时间模块 import datetime
-
配置settings
STATIC_URL = '/static/' STATICFILES_DIRS=[ os.path.join(BASE_DIR,'static') ] #定义上传文件夹的路径 UPLOAD_ROOT = os.path.join(BASE_DIR,'static/upload')
-
定义压缩图片和添加水印的函数.
# 图片添加水印 def Wate_Upload(imgname): # 压缩图片 img = cv2.imread('./static/upload/' + imgname) cv2.imwrite('./static/upload/' + imgname, img, [cv2.IMWRITE_JPEG_QUALITY, 20]) if not re.match('.*(jpg|png|jpeg)$',myfile): return Response({'code':403,'msg':'请上传png或jpg格式的文件'}) # 打开图片 img = Image.open('./static/upload/' + imgname) # 获取图片宽高 w, h = img.size # 指定字体 font = ImageFont.truetype("C:\Windows\Fonts\simkai.ttf", (w - h) // 10) # 定义画笔 draw = ImageDraw.Draw(img) # 水印的内容 text = '唱跳练习生' # 获取字宽高 font_w, font_h = font.getsize(text) # 执行画笔 坐标,内容,颜色,字体 draw.text((w - font_w, h - font_h), text, (0, 0, 0), font=font) # 保存图片 img.save('./static/upload/' + imgname)
-
后端接口类
class UploadFile(APIView): def post(self, request): # 接收参数 myfile = request.FILES.get('file') id = request.POST.get('uid') # 修改文件名 # 当前时间 now_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d%H%M%S') myfile.name = id + now_time + '.jpg' # 建立文件流对象 f = open(os.path.join(UPLOAD_ROOT, '', myfile.name), 'wb') # 写入 for chunk in myfile.chunks(): f.write(chunk) f.close() # 调用添加水印函数 Wate_Upload(myfile.name) user = User.objects.filter(id=int(id)).first() print(user.img) # 删除旧头像 if user.img != '': os.remove(user.img) user.img = 'static/upload/' + myfile.name user.save() else: user.img = 'static/upload/' + myfile.name user.save() return Response({ 'filename': myfile.name, 'msg': '更新成功' })
-
前段发送axios请求.
methods: { //上传文件 upload(e) { //获取文件 let file = e.target.files[0]; //声明表单参数 let param = new FormData(); param.append('file', file, file.name); param.append('uid', localStorage.getItem('uid')); //声明请求头 let config = {headers: {'Content-Type': 'multipart/form-data'}}; //发送请求 this.axios.post('http://127.0.0.1:8000/upload/', param, config) .then(res => { this.src='http://localhost:8000/static/upload/'+res.data.filename }) } }
-
展示图片
<Avatar :src="src" :width="150" fit="fill"></Avatar> <table> <tr> <td>用户头像: </td> <td> <input type="file" @change="upload"> </td> </tr> </table>