2011-10-26 34 views
7

Tôi cần một ứng dụng để cắt hình ảnh ở phía máy khách, ý tôi là, bằng cách sử dụng công cụ cắt xén như plugin Jcrop jquery.Ứng dụng Django cho hình ảnh cắt bằng công cụ cắt

tôi thấy công cụ này:

Nhưng cuối cùng hai phụ thuộc của admin và hai đầu dường như rất cùng với Ther riêng của ImageFields và các mô hình, bất kỳ giải pháp tốt?

Chúng tôi đang làm việc trên một ứng dụng lớn với nhiều tính năng và là sự thay đổi rất khó khăn logic lớn không lành mạnh

+1

Liên quan đến cắt xén hình ảnh django: Nếu bạn nhìn vào ImageCropField (https://github.com/jonasundderwolf/django-image-cropping/blob/master/image_cropping/fields.py), bạn sẽ nhận thấy rằng về cơ bản nó có trường hình ảnh chuẩn và chỉ thêm tiện ích con cho quản trị viên. Và ImageRatioField lưu trữ các tọa độ dưới dạng các chuỗi được phân tách bằng dấu phẩy, do đó, nó không quá khác so với đề xuất của những người ăn quá khứ. Vì vậy, bạn sẽ có thể dễ dàng redeclare một lĩnh vực hình ảnh tiêu chuẩn trong một ứng dụng hiện có như ImageCropField. Hoặc những lo lắng của bạn ("rất giống nhau") là gì? – arie

Trả lời

16

Tôi nghĩ rằng đây là một cái gì đó mà có thể bạn sẽ được giảm giá tốt nhất viết cho mình vì nó phụ thuộc vào cách dữ liệu và mô hình của bạn là Nếu bạn có một ứng dụng lớn, có thể bạn sẽ dành nhiều thời gian hơn để cố gắng uốn cong mã khác để làm những gì bạn cần trong tình hình.

(Mã này rất thô - Tôi chỉ đặt ra các bước thực sự)

Nếu bạn có một mô hình với một imagefield, bạn có thể thêm một lĩnh vực hình ảnh thứ hai để giữ hình ảnh cắt:

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

và biểu mẫu có trường thừa để giữ tọa độ jcrop sẽ được điền vào biểu mẫu ở phía máy khách (trường sẽ bị ẩn). Trong biểu mẫu nào bạn lưu tọa độ vào trường tùy thuộc vào bạn, nhưng có thể là ý tưởng sử dụng từ điển json (json.js ở phía máy khách và simplejson ở phía máy chủ), như sau:

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

dạng:

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 

một cái nhìn mà xử lý tất cả điều này:

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 
     ... 

và một chức năng để tạo ra các hình ảnh được cắt bằng PIL:

# Look here: http://djangosnippets.org/snippets/224/ 
def cropper(original_image_path, crop_coords): 
    """ Open original, create and return a new cropped image 
    ... 
Các vấn đề liên quan