91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django在保存圖像的同時壓縮圖像示例代碼怎么寫

發布時間:2021-10-13 15:40:14 來源:億速云 閱讀:147 作者:柒染 欄目:編程語言

這篇文章給大家介紹django在保存圖像的同時壓縮圖像示例代碼怎么寫,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

假設我們有一個非常簡單的Post模型,它將是一個圖像及其描述,

from django.db import modelsclass Post(models.Model): text = models.TextField() image = models.ImageField(upload_to='images/')

但是我們要優化圖像大小,這將由我們Post的image字段指出。 這樣做有充分的理由-它有助于更快地加載網站/應用程序并減少我們的服務器存儲。 在使用Django之前,首先讓我們簡單介紹一下使用Pillow進行圖像壓縮的概述。

使用Pillow壓縮圖像

Pillow是用于圖像相關操作的出色Python軟件包。 Image類帶有用于圖像io和操作的方法。 Image.open從文件路徑或文件對象讀取圖像。 Image類的save方法將質量作為以jpg格式保存圖像的可選參數,范圍為1到95,此參數的默認值為75,并且設置質量大于95會導致圖像尺寸大于 原本的。

from PIL import Imageim = Image.open('/some/path/to/image')im.save('/desired/path/new_image_name.jpg', quality=70)im.close()

使用quality參數不是減小大小的唯一方法。 例如,您可以將其與調整圖像大小相結合,以獲得更小的圖像尺寸。

利用Django signals

信號允許某些發送者通知一組接收者已經采取了某些措施。

Django帶有許多內置信號,目前,我們對django.db.models.signals.pre_save信號感興趣,該信號將在調用模型的save()方法之前發送。 要將處理程序連接到信號,有Signal.connect方法。 要將信號附加到特定的sender(在我們的例子中是模型),我們必須給Signal.connect方法提供sender參數,例如,將pre_save信號附加到我們的Post模型(上面定義),如下所示:

pre_save.connect(our_handler, sender=Post)

Django還提供了用于連接信號的接收器裝飾器,這使代碼更加慣用。 因此,除了定義our_handler并進行連接之外,我們還可以將our_handler的定義修飾為

from django.dispatch import receiver...@receiver(pre_save, sender=Post)def my_handler(sender, **kwargs): ...

現在,讓我們完成處理程序以壓縮圖像。 pre_save信號還將實例參數發送到處理程序函數,該函數對應于要保存的實際實例。 當我們要檢查字段是否已更新時,這特別有用,因為我們不想重復壓縮圖像。 因此我們可以將處理程序功能設為

from django.db.models.signals import pre_savefrom django.dispatch import receiver@receiver(pre_save, sender=Post)def handle_image_compression(sender, instance, **kwargs): try:  post_obj = Post.objects.get(pk=instance.pk) except Post.DoesNotExist:  # the object does not exists, so compress the image  instance.image = compress_image(instance.image) else:  # the object exists, so check if the image field is updated  if post_obj.image != instance.image:   instance.image = compress_image(instance.image)

現在,我們的最后一項任務是編寫compress_image函數,該函數將使用一個ImageField并返回一個ImageField。 PIL的Image.open()方法只能用于文件路徑或文件對象。 這是一個有趣的事實,它是ImageField的超類,它鏡像了python的File API,因此,我們可以像使用實際文件一樣使用它。 使用Image.open的問題已解決,但是Image.save呢? 事實證明Image.save可以將圖像寫入BytesIO對象。 因此,我們壓縮圖像的功能將變為

from PIL import Imagefrom io import BytesIOfrom django.core.files import Filedef compress_image(image): im = Image.open(image) out = BytesIO() im.save(out, 'JPEG', quality=70) compressed = File(out, name=image.name) im.close() return compressed

關于django在保存圖像的同時壓縮圖像示例代碼怎么寫就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

资溪县| 中宁县| 临武县| 阿坝| 壶关县| 古交市| 昔阳县| 无极县| 小金县| 临海市| 嵩明县| 将乐县| 罗江县| 陈巴尔虎旗| 如皋市| 大姚县| 宕昌县| 志丹县| 门源| 贵阳市| 敖汉旗| 竹溪县| 平江县| 会理县| 洪江市| 三门峡市| 青铜峡市| 永靖县| 海南省| 武定县| 九江县| 将乐县| 黄大仙区| 淮滨县| 肇州县| 彰武县| 安新县| 黄石市| 噶尔县| 孝义市| 分宜县|