06 Mart 2019 14:57

Muslu Y.

Django

Django Imagefield boyutlandırma, thumbnail ve otomatik ortalama

Anasayfa

Django

Django Imagefield boyutlandırma, thumbnail ve otom...

Django da Imagefiled ile yüklenen görselleri otomatik boyutlandırıp, boş bir görselin ortasına almak ve farklı boyutlarda yeni görseller üretmek içinr örnek kod

 

class Gorseller(models.Model):
galeri = models.ForeignKey(Galeri, on_delete=models.CASCADE)
dosya = models.ImageField(_('Görsel'), upload_to='galeri/')
aciklama = models.CharField(_('Açıklama'), max_length=250, help_text=_("En fazla 250 karakter"), default='deneme')
def save(self, *args, **kwargs):
if self.dosya:
from PIL import Image
### NOT: media/galeri/
### NOT: media/galeri/thumb/
### NOT: media/galeri/gecici/
### Mutlaka oluşturulmuş olmalı
thdosya_adi = '{}/galeri/thumb/{}-{}.jpg'.format(MEDIA_ROOT, slugify(self.galeri.adi), slugify(self.aciklama))
gecicidosya_adi = '{}/galeri/gecici/{}-{}.jpg'.format(MEDIA_ROOT, slugify(self.galeri.adi), slugify(self.aciklama))
arkaplan_Genislik, arkaplan_Yukseklik = 1920, 1080
thm_Genislik, thm_Yukseklik = 192, 108
## Yüklenen dosyayı oku
dosya = Image.open(BytesIO(self.dosya.read()))
### Tekrar boyutlandırılmak istenen görsel boyutları
dosya.thumbnail((arkaplan_Genislik, arkaplan_Yukseklik), Image.ANTIALIAS)
dosya.save(gecicidosya_adi, format='JPEG', quality=75)
### Thumnail için istenen görsel boyutları
dosya.thumbnail((thm_Genislik, thm_Yukseklik), Image.ANTIALIAS)
dosya.save(thdosya_adi, format='JPEG', quality=100)
### Boyutlandırılan görseli aç
gecici_img = Image.open(gecicidosya_adi)
### Ortalanması için istenen boşluk değerlerini hesapla
yukaridan = int((arkaplan_Yukseklik - gecici_img.size[1]) / 2)
soldan = int((arkaplan_Genislik - gecici_img.size[0]) / 2)
### Beyaz arkaplanlı boş bir dosya oluştur
bos = Image.new("RGB", (arkaplan_Genislik, arkaplan_Yukseklik), '#ffffff')
### Beyaz görsele boyutlandırılmış görseli ortalayarak ekle
bos.paste(gecici_img, (soldan, yukaridan))
### Dosyayı kaydetmek için geçici bir bellek oluştur
bosalan = BytesIO()
bos.save(bosalan, format='JPEG', quality=100)
bosalan.seek(0)
self.dosya = InMemoryUploadedFile(bosalan, 'ImageField', "{}-{}.jpg".format(slugify(self.galeri.adi), slugify(self.aciklama)), 'image/jpeg', bosalan.tell(), None)
super().save(*args, **kwargs)

 

 

Django

hakkında diğer konular

Makdos Bilişim Teknolojileri 2015 - 2025