[英]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>
/media/
它也無濟於事,請提供幫助。
並感謝大家之前的回復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.