Django imgareaselect手动剪切头像实现方法
admin
2023-07-31 02:29:51
0

本文实例讲述了Django imgareaselect手动剪切头像的方法。分享给大家供大家参考。具体如下:

 index.html:

 
 
 
 
上传图片 
 
 
{% csrf_token %} {{form.as_table}}

show.html:

 
 
 
 
HTML5的标题 
 
 
 
  

继续上传头像

{% if messages %} {% for message in messages %} {{ message }}

{% endfor %} {% endif %}

cut.html:

 
 
 
 
剪切 
 
 


 
 
 

头像剪切 返回

{% if messages %} {% for message in messages %} {{ message }}

{% endfor %} {% endif %}

点击原图 选择剪切区域

\"30\"/

预览选择区域

\"300\"/
{% csrf_token %}
剪切坐标 剪切尺寸
X1: {{form.x1}} 宽度: {{form.w}}
Y1: {{form.y1}} 高度: {{form.h}}
X2: {{form.x2}}
Y2: {{form.y2}}

forms.py:

#coding=utf-8 
from django import forms 
class PhotoForm(forms.Form): 
  photo_name = forms.ImageField(label=u\"头像\") 
class HatHeadCutForm(forms.Form): 
  x1=forms.IntegerField(widget=forms.TextInput(attrs={\'size\': 4,})) 
  y1=forms.IntegerField(widget=forms.TextInput(attrs={\'size\': 4,})) 
  x2=forms.IntegerField(widget=forms.TextInput(attrs={\'size\': 4,}))
  y2=forms.IntegerField(widget=forms.TextInput(attrs={\'size\': 4,})) 
  w=forms.IntegerField(widget=forms.TextInput(attrs={\'size\': 4,})) 
  h=forms.IntegerField(widget=forms.TextInput(attrs={\'size\': 4,})) 

models.py:

#coding=utf-8 
from django.db import models 
class Photo(models.Model): 
  photo_name=models.CharField(u\"图片路径\",max_length=255) 
  photo_thumb=models.CharField(u\"图片缩略图\",max_length=255) 

views.py:

#coding=utf-8 
from django.core.urlresolvers import reverse 
from django.shortcuts import render_to_response, get_object_or_404 
from django.http import HttpResponse,HttpResponseRedirect 
from django.template import RequestContext 
from django.contrib import messages 
import os,uuid,ImageFile,Image 
from PhotoCut.headhat.forms import PhotoForm,HatHeadCutForm 
from PhotoCut.headhat.models import Photo 
from PhotoCut.settings import MEDIA_ROOT,HEADHAT_ABS_PATH,HEADHAT_VIR_PATH 
def index(request,templates=\"headhat/index.html\"): 
  template_var={} 
  form=PhotoForm() 
  if request.method==\"POST\": 
    form = PhotoForm(request.POST.copy(),request.FILES) 
    if form.is_valid(): 
      file=request.FILES.get(\"photo_name\",None) 
      if file: 
        p=ImageFile.Parser() 
        for c in file.chunks(): 
          p.feed(c) 
        img=p.close() 
        if img.mode != \'RGBA\': 
          img = img.convert(\'RGBA\') 
        if img.size[0]>img.size[1]: 
          offset=int(img.size[0]-img.size[1])/2 
          img=img.crop((offset,0,int(img.size[0]-offset),img.size[1])) 
        else: 
          offset=int(img.size[1]-img.size[0])/2 
          img=img.crop((0,offset,img.size[0],(img.size[1]-offset))) 
        img.thumbnail((300, 300)) 
        file_name=\"%s.jpg\"%str(uuid.uuid1()) 
        img.save(os.path.join(HEADHAT_ABS_PATH,file_name),\"JPEG\",quality=100) 
        messages.info(request,u\"上传成功!\") 
        p=Photo.objects.create(photo_name=file_name) 
        p.save() 
        return HttpResponseRedirect(reverse(\"headhat_cut\",kwargs={\"id\":p.id})) 
  template_var[\"form\"]=form 
  return render_to_response(templates,template_var,context_instance=RequestContext(request)) 
def cut(request,id,templates=\"headhat/cut.html\"): 
  template_var={} 
  p=get_object_or_404(Photo,pk=int(id)) 
  if not p.photo_name: 
    messages.info(request,u\"请先上传图片!\") 
    return HttpResponseRedirect(reverse(\"headhat_index\")) 
  template_var[\"vir_path\"]=os.path.join(HEADHAT_VIR_PATH,p.photo_name)
  form=HatHeadCutForm() 
  if request.method==\'POST\': 
    form=HatHeadCutForm(request.POST) 
    if form.is_valid():       
      try: 
        img=Image.open(os.path.join(HEADHAT_ABS_PATH,p.photo_name))         
      except IOError: 
        messages.info(request,u\"读取文件错误!\")
      data=form.cleaned_data 
      img=img.crop((data[\"x1\"],data[\"y1\"],data[\"x2\"],data[\"y2\"]))
      img.thumbnail((50, 50)) 
      file_name=\"%s_%s\"%(os.path.splitext(p.photo_name)[0],\"_50_50.jpg\")       
      img.save(os.path.join(HEADHAT_ABS_PATH,file_name),\"JPEG\",quality=100)
      p.photo_thumb=file_name 
      p.save() 
      messages.info(request,u\"剪切成功!\") 
      return HttpResponseRedirect(reverse(\"headhat_show\")) 
    else: 
      messages.info(request,u\"请剪切后 再保存!\") 
  template_var[\"form\"]=form 
  return render_to_response(templates,template_var,context_instance=RequestContext(request)) 
def show(request,templates=\"headhat/show.html\"): 
  template_var={} 
  photos=Photo.objects.all() 
  template_var[\"path\"]=HEADHAT_VIR_PATH 
  template_var[\"photos\"]=photos 
  return render_to_response(templates,template_var,context_instance=RequestContext(request)) 

希望本文所述对大家的Python程序设计有所帮助。

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python查找阿姆斯特朗数 题目解释 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。 例如1^3 + 5...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...