溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

django 使用 PIL 壓縮圖片的例子

發(fā)布時(shí)間:2020-09-20 06:29:01 來(lái)源:腳本之家 閱讀:152 作者:兩鬢已不能斑白 欄目:開發(fā)技術(shù)

在最近做項(xiàng)目時(shí),發(fā)現(xiàn)服務(wù)器上的圖片比較大,數(shù)據(jù)傳輸時(shí)會(huì)消耗很多流量,體驗(yàn)非常不好。為了緩解這一現(xiàn)象,決定使用gzip壓縮數(shù)據(jù)流,但是發(fā)現(xiàn)gzip對(duì)于json數(shù)據(jù)的壓縮效果很好,但對(duì)于圖片的壓縮效果很差。無(wú)奈,只能寫一段代碼,將服務(wù)器上的圖片挨個(gè)壓縮一下。

我的服務(wù)器上的程序,是用django寫的,數(shù)據(jù)庫(kù)為sqlite,圖片文件存儲(chǔ)在media目錄下。

先看models.py,只有一個(gè)ImageField類型的變量picture,也就是一會(huì)壓縮圖片需要用到的變量。

class CrossPicture(models.Model):
  picture = models.ImageField(upload_to='cross_picture', blank=True, null=True)

Python有一個(gè)PIL庫(kù),可以處理圖像,壓縮部分的代碼就是用PIL寫的

def compressImage(request):

  picture_list = models.CrossPicture.objects.all()

  for cp in picture_list:
    image = Image.open(cp.picture) # 通過(guò)cp.picture 獲得圖像 
    width = image.width 
    height = image.height
    rate = 1.0 # 壓縮率

    # 根據(jù)圖像大小設(shè)置壓縮率
    if width >= 2000 or height >= 2000:
      rate = 0.3
    elif width >= 1000 or height >= 1000:
      rate = 0.5
    elif width >= 500 or height >= 500:
      rate = 0.9  

    width = int(width * rate)  # 新的寬
    height = int(height * rate) # 新的高

    image.thumbnail((width, height), Image.ANTIALIAS) # 生成縮略圖
    image.save('media/' + str(cp.picture), 'JPEG')  # 保存到原路徑
    cp.save()
  return HttpResponse('compress ok')

以上這篇django 使用 PIL 壓縮圖片的例子就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI