django-image-cropping如何通过视图提供裁剪图像

时间:2014-03-28 13:06:05

标签: django image django-models

我在我的项目中使用django-image-cropping

doc说:

  

原始图像保持完整,只有在显示时才会被裁剪。大图像呈现在   小格式,所以即使非常大的图像也可以轻松裁剪。

在我的模型中,我有字段:

logo = ImageCropField(upload_to=get_image_path, null=True, blank=True)
cropping_logo = ImageRatioField('logo', '186x186', size_warning=True)

用户可以在管理面板中调整照片的裁剪。如下图所示。 enter image description here

更改仅作为指示裁剪顶点的数值保存在cropping_logo字段中,例如:91,0,239,148

我想通过一些基于裁剪顶点的动态裁剪图像来提供服务但不知道如何。


更新:基于ubadub的提示使用PIL我使用这样的视图找出了以下解决方案。

def thumbnail(request, image_file):
    image_file = '/'.join(('img', image_file))
    f = MyModel.objects.get(logo=image_file)
    img = Image.open(''.join((os.getcwd(), f.logo.url)))
    box = tuple([int(i) for i in f.cropping_logo.split(',')])
    img = img.crop(box)
    response = HttpResponse(mimetype="image/png")
    img.save(response, "jpeg")
    return response

所需的进口是:

import os
from PIL import Image
from django.http import HttpResponse

您的网址格式可能如下所示:

url(r'^thumbnail/(?P<image_file>.+)$', 'yourapp.views.thumbnail'),

1 个答案:

答案 0 :(得分:2)

好吧,一个选项是在某个网址上提供一些视图,返回使用css裁剪的图片:

示例css:

img 
{
position:absolute;
clip:rect(0px,60px,200px,0px);
}

其中clip:rect具有模型中定义的尺寸。

css可以是内联的(不好的做法,但无论如何)或动态提供的css文件(也可能不是动态提供css文件的最佳想法,但在这种情况下是必需的。)

然而,这仍然会提供一个HTML页面。如果你想提供一个mime类型的图像页面,那么另一个选择,然后这样做,但你需要PIL(Python图像库):

response = HttpResponse(mimetype="image/png")
img.save(response, "PNG")
return response

其中img是裁剪到指定尺寸的原始图像。

当然,用您图像所处的文件格式替换png。