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
...
Nguồn
2011-10-26 20:36:00
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