7

クライアント側で画像を切り抜くためのアプリが必要です。つまり、Jcropjqueryプラグインのような切り抜きツールを使用します。

私はこのツールを見つけました:

しかし、最後の2つは管理者に依存しており、最初の2つは独自のImageFieldsとモデルに非常に関連しているように見えますが、良い解決策はありますか?

私たちは多くの機能を備えた大きなアプリケーションに取り組んでおり、記述されたロジックを変更することは非常に困難です

4

1 に答える 1

17

これは、データとモデルのレイアウト、作物を保存するかどうか(およびどこで)、オリジナルを保持するかどうかなどに依存するため、おそらく自分で書くのが最善だと思います。あなたは大きなアプリを持っているので、あなたはおそらくあなたの状況であなたが必要とすることをするために他のコードを曲げようとするのにより多くの時間を費やすでしょう。

(このコードは非常に大まかなものです-私は実際に手順をレイアウトしているだけです)

画像フィールドのあるモデルがある場合は、トリミングされた画像を保持するために2番目の画像フィールドを追加できます。

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 - http://stackoverflow.com/questions/1308386/programmatically-saving-image-to-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
    ...
于 2011-10-26T20:36:00.083 に答える