作者:天秤蜗牛666 | 来源:互联网 | 2018-04-26 23:19
本文实例讲述了Django imgareaselect手动剪切头像的方法。分享给大家供大家参考。具体如下:
index.html:
{% csrf_token %}
show.html:
继续上传头像
{% if messages %}
{% for message in messages %}
{{ message }}
{% endfor %}
{% endif %}
{%for p in photos%}
继续剪切
{%endfor%}
cut.html:
头像剪切 返回
{% if messages %}
{% for message in messages %}
{{ message }}
{% endfor %}
{% endif %}
点击原图 选择剪切区域
预览选择区域
{% csrf_token %}
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程序设计有所帮助。