Kali ini saya akan bagikan sedikit tips untuk melakukan resize gambar atau foto secara masal. Tapi dengan satu catatan, hasil resize nanti akan memiliki nilai lebar yang sama, :D Waktu itu saya dimintai tolong sama Ibu Bos untuk me-resize foto hasil dari jepretan kamera digital agar bisa dibuka di BB-nya. Nah, dia gak bilang, gambar mana saja yang di-resize. Jumlah fotonya juga lumayan, lebih dari 600 file. wah,... jelas, pasti patah ni jari nanti kalo resize-nya manual. Tapi untungnya, GNU/Linux menyediakan banyak tools yang bisa dimanfaatkan secara bersama, :) Disini tools yang akan digunakan adalah ImageMagick dan sedikit script Python. Bila pada sistem kamu belum terinstall ImageMagick, silahkan install terlebih dahulu paket ImageMagick dari repositori distro masing-masing. Perintah yang digunakan adalah convert, dengan opsi -resize. Contoh: $ convert -resize 600 file_in.jpg file_out.jpg Penjelasan singkatnya seperti ini: convert adalah salah satu utilitas dari paket ImageMagick.-resize adalah salah satu opsi yang disediakan dari utilitas convert yang digunakan untuk merubah ukuran (lebar) gambar.600 adalah nilai lebar gambar yang ingin dihasilkan.file_in.jpg adalah file gambar yang ingin di resizefile_out.jpg adalah file gambar hasil resizeSedangkan untuk script Python sendiri kita memanfaatkan module os.system yang dapat menjalankan perintah yang dimiliki sistem GNU/Linux.Script terlihat seperti berikut: #!/usr/bin/env python Simpan dengan nama (misalnya) image_resize.py kemudian pindahkan ke folder dimana foto yang ingin di-resize berada. Buka terminal, pindah ke direktori yang sama dimana script dan foto tadi berada dan jalankan perintah:
Bismillah. Pada artikel ini saya ingin berbagi pengalaman ketika saya harus melakukan resize image saat upload image di python Django. Untuk source code lengkapnya ada di github dan linknya ada di artikel ini. Semoga bermanfaat. Pada aplikasi haven.darusinau.com ada kebutuhan upload image untuk data rumah. Ada beberapa pilihan yang terlintas seperti AWS S3 atau menggunakan API ImageBB, kemudian setelah menimbang antara kebutuhan storage, jumlah user, dan biaya yang akan dikeluarkan akhirnya saya memilih untuk menggunakan upload file Django biasa. Namun untuk mengatasi keterbatasan storage yang saya miliki, saya memutuskan untuk me-resize tiap image yang diupload. Memang hal ini akan mengorbankan kualitas gambar yg ter-upload tapi hal ini tidak berdampak signifikan mengingat untuk saat ini kebutuhan di aplikasi ini belum mengandalkan gambar yang high resolution pada listing rumah. Cara Upload Gambar di DjangoUntuk upload gambar pada Django kita membutuhkan library tambahan yaitu PIL. Sebetulnya tanpa menggunakan PIL tidak apa-apa tetapi upload gambar akan dianggap sebagai upload file biasa. Dan harus menggunakan tipe FileField pada property model yang kita buat. Kemudian yang harus dilakukan pertama kali adalah membuat field pada model yang kita punya dengan tipe ImageField. Sebagai contoh: Python1 image = models.ImageField('Gambar', null=True, blank=True, upload_to=house_dir) Jika belum terinstall library PIL biasanya saat proses migrasi/makemigrations Django akan memberitahukan error message sebagai berikut: PowerShell1 Cannot use ImageField because Pillow is not installed. Untuk install PIL kita bisa menggunakan perintah berikut: PowerShell1 pip install Pillow PIL itu sendiri singkatan dari Python Image Library sedangkan Pillow merupakan project image processing library yang merupakan hasil fork/percabangan dari PIL. Maka dari itu kita bisa saja menggunakan Pillow dalam tutorial kali ini. Sebelum lanjut kita harus menambahkan settingan lokasi directory untuk menaruh uploaded image. Untuk mengatur ini bisa dilakukan di settings.py dengan menambahkan baris berikut Python1 2 3 4 STATIC_URL = '/static/' MEDIA_URL = '/media/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') MEDIA_ROOT = os.path.join(BASE_DIR, 'media') Kemudian saya akan membuat model bernama Product. Model ini memiliki dua atribut image dan name. 1 2 3 class Product(models.Model): image = models.ImageField('Gambar', null=True, blank=True) name = models.CharField('Nama Produk', max_length=30) Untuk mempersingkat code contoh view kali ini saya akan menggunakan Class Based View milik Django yaitu CreateView. Python1 2 3 4 class CreateProduct(CreateView): model = Product fields = ['name', 'image'] success_url = reverse_lazy('resize_image:list') Karena kita menggunakan Django CBV default nama template untuk class diatas adalah product_form.html Kurang lebih code untuk template adalah sebagai berikut 1 2 3 4 5 6 7 8 {% extends 'resize_image/base.html' %} {% block 'content' %} <form method="post" enctype="multipart/form-data"> {% csrf_token %} {{form.as_p}} <button type="submit" name="button" class="btn btn-primary">Save</button> </form> {% endblock %} Jika ingin menggunakan upload file/gambar pastikan kita menggunakan attribute enctype="multipart/form-data" pada tag form milik kita. Sampai sejauh ini upload file seharusnya sudah selesai. Resize GambarKemudian setelah berhasil di-upload proses berikutnya yaitu mengubah ukuran gambarnya menjadi lebih kecil. Karena sebelumnya kita sudah menggunakan library PIL kita bisa menggunakan method resize dari library ini. Untuk penerapannya method resize dari PIL pada tutorial ini saya akan meng-verride function save() bawaan dari model. Sehingga proses resize akan terjadi sebelum object dari model akan disimpan. Pada file models.py di class Product tambahkan function save: Python1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def save(self): import sys from PIL import Image from io import BytesIO from django.core.files import File
im = Image.open(self.image) basewidth = 200 wpercent = basewidth/float(im.size[0]) hsize = im.size[1]*wpercent size_f = (basewidth, int(hsize)) im = im.resize(size_f, Image.NEAREST)
output = BytesIO() im.save(fp=output, format='JPEG', quality=90) self.image = File(output, name=self.image.name)
super(Product, self).save() Sedikit penjelasan, pada basewidth = 200 ini adalah maksimal lebar yang diperbolehkan dimiliki gambar. Kemudian untuk mendapatkan tinggi dari gambar kita harus menghitung rasio dari lebar asli dengan angka maksimal wpercent = basewidth/float(im.size[0]), kemudian tinggal dikalikan saja rasionya hsize = im.size[1]*wpercent dan akan didapatkan tinggi baru sesuai dengan rasio gambarnya. Kemudian setelah didapatkan ukuran lebar dan tingginya bisa kita masukkan pada function resize, im = im.resize(size_f, Image.NEAREST). Image.NEAREST maksudnya adalah pemilihan algoritma resize yang akan kita gunakan selain NEAREST ada beberapa algoritma lain seperti BICUBIC, BILINEAR, BOX, HAMMING, LANCZOS, NEAREST. Setiap algoritma menghasilkan kualitas dan penyusutan size yang berbeda. Pada keperluan saya NEAREST merupakan algoritma yang cukup memenuhi kebutuhan saya. KesimpulanUntuk melakukan resize pada uploaded image di Django sangat mudah. Kita cukup melakukan menggunakan function resize yang sudah tersedia pada library PIL sendiri. Untuk improvement proses resize tersebut dapat dipindah ke dalam file tersendiri agar bisa dipakai oleh model lain yang ingin melakukan resize pada field imagenya. Jika kamu memiliki pertanyaan mengenai bahasan artikel ini kamu bisa meninggalkan komentar atau lihat code lengkap pada github saya. Jika kamu ingin dibantu dalam mempelajari Django secara private via zoom atau ingin meng-hire saya dalam sebuah project bisa menghubungi instagram saya juga di @darusinau. |