簡體   English   中英

如何在現有的 Django object 中保存枕頭處理的圖像

[英]How to save pillow processed image in already existing Django object

我創建了一個 object model 如下

from django.db import models

# Create your models here.
class ImageModel(models.Model):
    image = models.ImageField(upload_to='images/')
    editedImg = models.ImageField(upload_to='images/')

    def delete(self, *args, **kwargs):
        self.image.delete()
        self.editedImg.delete()
        super().delete(*args, **kwargs)

這就是我在 function 中嘗試做的事情

from django.shortcuts import render
from EditorApp.forms import ImageForm
from EditorApp.models import ImageModel
from django.http import HttpResponseRedirect
from PIL import Image

def edit_column(request):
    codArr = request.POST.getlist('codArr[]')
    imgs = ImageModel.objects.first()
    orgImage = ImageModel.objects.first().image
    orgImage = Image.open(orgImage)
    croppedImg = orgImage.crop((int(codArr[0]), int(codArr[1]), int(codArr[2]), int(codArr[3])))
    # croppedImg.show()
    # imgs.editedImg = croppedImg
    # imgs.save()
    return HttpResponseRedirect("/editing/")

我想要做的是 codArr 由數組形式的頂部(x,y)和底部(x,y)的坐標組成(這不是問題並且經過測試( croppedImg.show()顯示了所需的裁剪圖像) 並處理並用於裁剪圖像)。 圖像裁剪工作正常。 但我想做的是將裁剪后的圖像保存在上面使用的editedImg的editedImg 中。 上面評論的一個是我嘗試過但拋出錯誤AttributeError: _committed

因為我沒有在 model 中使用任何圖像名稱,因為它不是必需的。 請幫助,將非常感謝。

你應該這樣做:

from io import BytesIO
from api.models import ProductPicture
from django.core import files

codArr = request.POST.getlist('codArr[]')
img_obj = ImageModel.objects.first()
orgImage = img_obj.image
orgImage = Image.open(orgImage)
croppedImg = orgImage.crop((int(codArr[0]), int(codArr[1]), int(codArr[2]), int(codArr[3])))
thumb_io = BytesIO()  # create a BytesIO object
croppedImg.save(thumb_io, 'png')
editedImg = files.File(thumb_io, name=file_name)
img_obj.editedImg = editedImg
img_obj.save()

您可以使用 Python 的上下文管理器打開圖像並將其保存到所需的存儲中,在這種情況下我使用images目錄。

Pillow 將裁剪圖像,image.save() 會將其保存到文件系統,之后,您可以將其添加到 Django 的 ImageField 並將其保存到數據庫中。

上下文管理器負責文件的打開和關閉,Pillow 負責圖像,Django 負責 DB。

from PIL import Image

with Image.open(orgImage) as image:
    file_name = image.filename # Can be replaced by orgImage filename
    cropped_path = f"images/croped-{file_name}"
    # The crop method from the Image module takes four coordinates as input.
    # The right can also be represented as (left+width)
    # and lower can be represented as (upper+height).
    (left, upper, right, lower) = (20, 20, 100, 100)

    # Here the image "image" is cropped and assigned to new variable im_crop
    im_crop = image.crop((left, upper, right, lower))
    im_crop.save(cropped_path)
    imgs.editedImg = cropped_path
    imgs.save()

枕頭參考

@misraX 我已經做到了,就像你展示的那樣

def edit_column(request):
    codArr = request.POST.getlist('codArr[]')
    imgs = ImageModel.objects.first()
    orgImage = ImageModel.objects.first().image
    path_to_save = str(Path(__file__).resolve().parent.parent)
    with Image.open(orgImage) as image:
        print(Path(__file__).resolve().parent.parent)
        cropped_path = path_to_save + "/media/images/croped.png"
        print(cropped_path)
        im_crop = image.crop((int(codArr[0]), int(codArr[1]), int(codArr[2]), int(codArr[3])))
        im_crop.save(cropped_path)
        imgs.editedImg = cropped_path
        imgs.save()

在 django 管理站點中。 當前的圖像鏈接不同。 django 網站參考

已保存的圖像當前鏈接為images/tree.jpg而新更新的裁剪圖像當前鏈接為: /home/aashiq/Documents/Django/My_Django_Stuff/MyProject/ImageEditor/media/images/croped.png

 <div class="container"> <img id="myImgId" src="/media/{{ orgImg }}" alt="Avatar" /> </div> <div class="container"> <img src="/media/{{ cropImg }}" alt="Avatar" /> </div>
因此它不起作用。 如果我打印 PIL 圖像兩者都有不同的路徑以及路徑不同,即使我刪除/media/它也無濟於事,請提供幫助。 並感謝大家之前的回復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM