压缩图片并添加水印

压缩图片并添加水印demo

  1. 导入我们需要的库

    # 导入图片库
    # 绘画库
    from PIL import ImageDraw
    # 字体库
    from PIL import ImageFont
    # 图片库
    from PIL import Image
    import cv2
    # 导入上传文件夹配置
    from mydjango.settings import UPLOAD_ROOT
    import os
    # 导入时间模块
    import datetime
    
  2. 配置settings

    STATIC_URL = '/static/'
    
    STATICFILES_DIRS=[
         os.path.join(BASE_DIR,'static')
    ]
    
    #定义上传文件夹的路径
    UPLOAD_ROOT = os.path.join(BASE_DIR,'static/upload')
    
  3. 定义压缩图片和添加水印的函数.

    # 图片添加水印
    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)
    
    
  4. 后端接口类

    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': '更新成功'
            })
    
    
  5. 前段发送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
              })
          }
        }
    
  6. 展示图片

            <Avatar :src="src" :width="150" fit="fill"></Avatar>
            <table>
              <tr>
                <td>用户头像: </td>
                <td>
                  <input type="file" @change="upload">
                </td>
              </tr>
    		</table>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值