Приложение Django для обрезки изображения с помощью инструмента обрезки - PullRequest
7 голосов
/ 26 октября 2011

Мне нужно приложение для обрезки изображения на стороне клиента, я имею в виду использование инструмента обрезки, такого как плагин Jcrop jquery.

Я нашел следующие инструменты:

Но последние два зависят от администратора, а первые два кажутся очень связанными с собственными ImageFields и моделями, есть ли хорошее решение?

Мыработать над большим приложением со многими функциями и очень сложно изменить логику написано

1 Ответ

16 голосов
/ 27 октября 2011

Я думаю, это то, что вам, вероятно, лучше всего будет написать самостоятельно, поскольку это зависит от того, как выстроены ваши данные и модели, хотите ли вы (и где) сохранить урожай, хотите ли вы сохранить оригиналы и т. Д.Даже если у вас большое приложение, вы, вероятно, потратите больше времени, пытаясь согнуть другой код, чтобы сделать то, что вам нужно в вашей ситуации.

(этот код очень грубый - я просто выкладываю шаги на самом деле)

Если у вас есть модель с полем изображения, вы можете добавить второе поле изображения для хранения обрезанного изображения:

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 - /911333/programmnoe-sohranenie-izobrazheniya-v-django-imagefield
        ...

и функция для создания обрезанного изображения с использованием PIL:

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