Menggabungkan Image PNG menggunakan library PIL

Sebenarnya apa yang ingin saya tulis ini sudah ada di dokumentasi dan tutorial-tutorial online. Tetapi tidak ada salahnya saya kira kalau saya membagikan apa yang saya tahu. Kalaupun ternyata ada salahnya, ya mumpung ini masih terhitung Hari Lebaran, saya mohon maaf lahir dan batin. 😀

Library PIL adalah library pengolah gambar di bahasa pemrograman Python. Yang saya bagikan ini hanyalah sebagian kecil sekali dari fasilitas yang ada di library tersebut. Fokus saya adalah di bagian penggabungan gambar.

Kadang kita ingin menggabungkan dua atau lebih gambar, hal yang sebenarnya sangat mudah dilakukan dengan menggunakan software pengolah gambar seperti Photoshop atau Gimp. Tetapi kalau yang ingin digabungkan itu ada banyak sekali file, maka kadang kita perlu juga melirik script untuk otomatisasinya.

Batasan Kasus

Supaya tidak terlalu melebar, saya akan membatasi kasus ini dengan penggabungan gambar yang sama ukurannya. Tekniknya seperti overlay layer di css dengan positioning. Untuk kebutuhan ini saya akan menggunakan metode paste dari library PIL.Image.

Biasanya yang saya lakukan adalah membuka satu persatu image/gambar yang mau digabung tersebut.

from PIL import Image #import dulu library yang ingin digunakan

im = Image.open('/path/asli/lokasi/gambar.png')
im2 = Image.open('/path/asli/lokasi/gambar2.png')

#misalnya dua gambar itu yang ingin kita gabungkan

Setelah itu kita siapkan canvas tempat kita akan menggabungkan dua gambar tersebut. Karena dua gambar itu ukurannya sama, kita ambil saja salah satunya sebagai dasar ukuran canvas.

canvas_size = im.size #mengambil ukuran dimensi gambar
bg = Image.new('RGB',canvas_size,(255,255,255))
# RGB adalah mode gambar. 255,255,255 berarti kita beri warna putih

Setelah canvas siap, maka kita bisa menggabungkan gambar di atas, misalnya kita ingin menimpa gambar im dengan im2. Di sini filenya adalah png transparent, sehingga ketika ditimpa, gambar im tidak seluruhnya tertutup oleh gambar im2. Langkahnya sebagai berikut:

bg.paste(im,(0,0))
#gambar im kita timpa di atas canvas, di koordinat 0,0.

Maka di atas canvas (bg) sudah akan muncul gambar im. Tetapi kita ingin agar transparansi gambar im tetap ada, sehingga background putih canvas tidak tertutup blok hitam. Untuk hal ini, script di atas kita ubah menjadi:

bg.paste(im,(0,0),im)
# seperti langkah di atas, tetapi kita tambahkan masking im

#lalu dilanjut dengan menempatkan gambar im2 di atas im
#maka kita lanjutkan dengan script berikut

bg.paste(im2,(0,0),im2)

Voila! gambar im2 sudah bergabung dengan gambar im. Untuk melihatnya, kita bisa menggunakan perintah bg.show()

Script lengkapnya jadinya begini:

from PIL import Image #import dulu library yang ingin digunakan

im = Image.open('/path/asli/lokasi/gambar.png')
im2 = Image.open('/path/asli/lokasi/gambar2.png')

canvas_size = im.size #mengambil ukuran dimensi gambar
bg = Image.new('RGB',canvas_size,(255,255,255))
bg.paste(im,(0,0),im)
bg.paste(im2,(0,0),im2)
bg.show()

Menyimpan hasil ke django model ImageField

Nah, setelah gambar itu tergabung, seandainya kita menggunakan django, maka kita perlu menyimpan image itu ke models. Untuk kebutuhan ini, saya kadang menggunakan memory untuk meredraw hasil gabungan gambar tersebut, lalu memanfaatkan fasilitas InMemoryUploadedFile di django untuk menyimpannya ke database.

Sehingga script di atas akan menjadi seperti ini

#misalkan kita mempunyai models seperti ini

class DataImage(models.Model):
    title = models.CharField(max_length=255)
    image = models.ImageField(upload_to='image')

maka kita ubah script lengkap yang saya tulis di atas tadi, menjadi seperti ini:

import StringIO

tempFile = StringIO.StringIO()

im = Image.open('/path/asli/lokasi/gambar.png')
im2 = Image.open('/path/asli/lokasi/gambar2.png')

canvas_size = im.size #mengambil ukuran dimensi gambar
bg = Image.new('RGB',canvas_size,(255,255,255))
bg.paste(im,(0,0),im)
bg.paste(im2,(0,0),im2)

# menyimpan hasil generate ke stringIO file

bg.save(tempFile, format="JPEG")
#format bisa diubah sesuai kebutuhan. 
#dalam contoh ini, saya menyimpannya dengan kompresi jpeg

Setelah itu, kita bisa menyimpannya ke model DataImage dengan langkah berikut:

from django.core.files.uploadedfile import InMemoryUploadedFile

image_file = InMemoryUploadedFile(tempFile, None, 'nama_file.jpg','image/jpeg',tempFile.len, None)

#nama file diubah sesuai nama yang ingin kita simpan

Dari sini kita bisa langsung menyimpannya ke database.

daim = DataImage()
daim.title = "nama file"
daim.image.save("nama_file.jpg",image_file)
daim.save()

image hasil gabunganpun tersimpan ke database. File disimpan ke MEDIA_DIRECTORY sesuai setelan di settings.py

Demikian serba sedikit yang bisa saya bagi. Tidak begitu penting, tetapi semoga bisa bermanfaat bagi yang membutuhkan 😀

vale, demi parsletongue

el rony, mendesissssssss ssss sssss

nb. sekedar untuk lucu-lucuan, kita juga bisa menggunakan php untuk hal ini

<?php
$ibody = base_url('path/relative/to/body.png');
$istrap = base_url('path/relative/to/strap.png');
$ipads = base_url('path/relative/to/pads.png');
$imgInfo = getimagesize($ibody);
$basebody= imageCreateFromPNG($ibody);

// menentukan ukuran canvas
$w = "319";
$h = "221";

// men-scale image ke ukuran canvas dg aspect ratio
if ($imgInfo[0] <= $w && $imgInfo[1] <= $h) {
    $nHeight = $imgInfo[1];
    $nWidth = $imgInfo[0];
} else {
    if ($w/$imgInfo[0] > $h/$imgInfo[1]) {
        $nWidth = $w;
        $nHeight = $imgInfo[1]*($w/$imgInfo[0]);
    }else{
        $nWidth = $imgInfo[0]*($h/$imgInfo[1]);
        $nHeight = $h;
    }
}
$nWidth = round($nWidth);
$nHeight = round($nHeight);

// membuat canvas
$base = imagecreatetruecolor($nWidth, $nHeight);

imagealphablending($base, false);
imagesavealpha($base, true);
$transparent = imagecolorallocatealpha($base, 255, 255, 255, 127);
imagefilledrectangle($base, 0, 0, $nWidth, $nHeight, $transparent);
imagealphablending($base, true);
imagecopyresampled($base, $basebody, 0, 0, 0, 0, $nWidth, $nHeight, $imgInfo[0], $imgInfo[1]);

$insert2 = imageCreateFromPNG($istrap);
imagealphablending($insert2, true);
imagesavealpha($insert2, true);
imagecopyresampled($base,$insert2,0,0,0,0,$nWidth,$nHeight,$imgInfo[0], $imgInfo[1]);


$insert3 = imageCreateFromPNG($ipads);
imagealphablending($insert3, false);
imagesavealpha($insert3, true);
imagecopyresampled($base,$insert3,0,0,0,0,$nWidth,$nHeight,$imgInfo[0], $imgInfo[1]);


header('Content-type: image/png');
imagepng($base);
imagedestroy($base);
if(isset($insert2)){
    imagedestroy($insert2);
}
if(isset($insert3)){
    imagedestroy($insert3);
}
?>

iya.. script-script ini yang saya pakai untuk webnya NOKNbag 😀

Leave a Reply

Your email address will not be published. Required fields are marked *