使用裁剪工具的Django图像裁剪应用程序

7
我需要一个用于客户端裁剪图像的应用程序,也就是使用像Jcrop jQuery插件这样的裁剪工具。
我找到了这些工具: 但是最后两个依赖于管理和前两个似乎与自己的ImageFields和模型非常耦合,有什么好的解决方案吗?
我们正在开发一个具有许多功能的大型应用程序,更改编写的逻辑非常困难。

1
关于django-image-cropping:如果您查看ImageCropField(https://github.com/jonasundderwolf/django-image-cropping/blob/master/image_cropping/fields.py),您会注意到它基本上只是在标准图像字段中添加了用于管理员的小部件。 而且,ImageRatioField将坐标存储为逗号分隔的字符串,因此与pastylegs的建议并没有太大的不同。 因此,您应该能够将现有应用程序中的标准图像字段轻松重新声明为ImageCropField。或者您的担忧是什么(“非常耦合”)? - arie
1个回答

17

我认为你最好自己编写这个功能,因为它取决于你的数据和模型的布局,是否要保存裁剪后的图像以及是否要保留原始图像等。即使你有一个大型应用程序,你也可能会花费更多时间来修改其他代码以适应你在现实情况中所需的功能。

(这段代码非常粗糙-我只是列出了步骤)

如果你的模型有一个图像字段,你可以添加第二个图像字段来保存裁剪后的图像:

class MyModel(models.Model):
    image = models.ImageField(...)
    image_crop = models.ImageField(...)

新增一个表单字段用于保存 jcrop 坐标,该字段将在客户端填充(该字段应为隐藏字段)。如何将坐标保存到该字段中取决于您,但使用 json 字典(客户端使用 json.js,服务器端使用 simplejson)可能是个好主意,例如:

{ 'x1' : '145', 'y1' : '200'  ... }

表单:

class MyModelForm(form.ModelForm):
    """ Hide a field to hold the coordinates chosen by the user """
    crop_coords = forms.CharField(attrs={'style':'display:none'})        

    class Meta:
         model = MyModel

一个处理所有这些的视图:

def some_view(request):
    form = request.POST
    if form.is_valid():
        crop_coords = form.cleaned_data['crop_coords']
        # decode the coords using simpleson (or however you passed them)
        ...
        # create a cropped image 
        original_image = form.cleaned_data['image']
        cropped_image = cropper(original_image.path, crop_coords)
        ...
        # save it back to the db - https://dev59.com/TXM_5IYBdhLWcg3wmkYK
        ...

还需使用PIL编写一个创建裁剪图像的函数:

# Look here: http://djangosnippets.org/snippets/224/
def cropper(original_image_path, crop_coords):
    """ Open original, create and return a new cropped image
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接