Cara menggunakan python resize list

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:

convertadalah salah satu utilitas dari paket ImageMagick.-resizeadalah salah satu opsi yang disediakan dari utilitas convert yang digunakan untuk merubah ukuran (lebar) gambar.600adalah nilai lebar gambar yang ingin dihasilkan.file_in.jpgadalah file gambar yang ingin di resizefile_out.jpgadalah file gambar hasil resize
Sedangkan 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

# memuat module os
import os

# membuat list dari isi direktori
x=os.listdir('.')

# membuat perulangan yang berfungsi sebagai
# pemroses file
for y in x:
    # memfilter tipe file dari ekstensinya
    if y.endswith('.jpg') or y.endswith('.JPG'):
        # menentukan nama file hasil resize
        x_new="%s_new.jpg"%y[:-4]
        # verbose mode
        print "Resizing file: %s"%y,
        # fungsi untuk menjalankan perintah convert
        os.system('convert -resize 600 %s %s'%(y,x_new))
        print " ... done"
    else:
        # fungsi skip untuk file yang tidak ber-ekstensi jpg
        print "Skipping file: %s"%y
print "Resizing completed!!"


Cara menggunakan python resize list

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:

    $ python image_resize.py

Prosesnya akan terlihat seperti berikut:

Cara menggunakan python resize list


Download:
    ImageMagick
        http://imagemagick.org/script/index.php

Info:
    ImageMagick
        http://www.imagemagick.org/script/convert.php?ImageMagick=859jg1aisufmfmiio2v1ruin07
   
    Python
       
       
       
       
       
       
       



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.

Use Case

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 Django

Untuk 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:

Python

1

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:

PowerShell

1

Cannot use ImageField because Pillow is not installed.

Untuk install PIL kita bisa menggunakan perintah berikut:

PowerShell

1

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

Python

1

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.

Python

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.

Python

1

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

Python

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 Gambar

Kemudian 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:

Python

1

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.

Kesimpulan

Untuk 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.