2011-10-26 9 views
7

Necesito una aplicación para recortar una imagen en el lado del cliente, quiero decir, usando una herramienta de recorte como Jcrop jquery.Aplicación Django para recortar imágenes usando una herramienta de recorte

me encontré con estas herramientas:

pero los dos últimos depende de admin y los dos primeros parecen muy acoplados a que exista propios ImageFields y modelos, ¿alguna buena solución?

Estamos trabajando sobre una gran aplicación con muchas características y es un cambio muy difícil la lógica writed

+1

Con respecto a django-image-cropping: Si mira ImageCropField (https://github.com/jonasundderwolf/django-image-cropping/blob/master/image_cropping/fields.py) notará que básicamente toma el campo de imagen estándar y solo agrega el widget para el administrador. Y ImageRatioField almacena las coordenadas como cadenas separadas por comas, por lo que no es muy diferente de la sugerencia de pastylegs. Por lo tanto, debería poder redeclarar fácilmente un campo de imagen estándar en una aplicación existente como ImageCropField. ¿O cuáles son sus preocupaciones ("muy acoplado")? – arie

Respuesta

16

creo que esto es algo que probablemente será mejor fuera de la escritura a sí mismo, ya que depende de cómo son sus datos y modelos planteado, si (y dónde) quiere guardar los cultivos, si desea conservar los originales, etc. Incluso si tiene una gran aplicación, probablemente pasará más tiempo tratando de doblar otro código para hacer lo que necesita en su situación.

(Este código es muy áspero - Estoy trazar los pasos realmente)

Si usted tiene un modelo con un ImageField, se podría añadir un segundo campo de imagen para mantener la imagen recortada:

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

y un formulario con un campo adicional para contener las coordenadas jcrop que se completarán en el formulario en el lado del cliente (el campo estará oculto). En qué forma guarda las coordenadas en el campo depende de usted, pero podría ser una idea usar un diccionario json (json.js en el lado del cliente y simplejson en el lado del servidor), algo como:

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

la forma:

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 

una vista que procesa todo esto:

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 - http://stackoverflow.com/questions/1308386/programmatically-saving-image-to-django-imagefield 
     ... 

y una función para crear la imagen recortada usando PIL:

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