blogpost request dari
indrio :P
quick hack membuat layanan web untuk gambar menggunakan python dan google appengine image api :
apa itu layanan web / web service?
kalau kata
indrio sih web service itu hampir sama seperti halnya aplikasi berbasiskan web (diakses menggunakan web browser), tapi aplikasi web dibuat untuk berinteraksi langsung dengan penggunanya, ada tombol yang bisa diklik, ada tampilan yang bisa dilihat, sedangkan web service tidak memiliki semua itu.
web service dibuat untuk digunakan oleh program lain layaknya sebuah modul, tapi bukan berarti dia tidak bisa digunakan secara langsung oleh end user, tergantung bagaimana sebuah web service didesign.
pernah make
google?
bayangkan kita membuat suatu program pencarian untuk mencari dokumen yang ada di komputer kita, dalam program itu kita buat 1 class yang bernama "google", lalu pada class tersebut kita definisikan sebuah metode yang dinamakan "search".
metode inilah inti program yang melakukan proses pencarian dokumen2 di komputer kita.
untuk bisa bekerja, kita harus memberitahu metode tersebut dokumen apa yang dicari,
berarti metode tersebut membutuhkan sebuah parameter, sebut saja "q"
pada python, untuk menjalankan program itu dapat dilakukan dengan syntax:
google.search(q)
salah satu contoh web service yang sering kita gunakan sehari2 adalah
google search engine,
disini "www.google.co.id" dapat dianalogikan sebagai sebuah class yang memiliki metode "search" dan memiliki user interface berupa halaman web untuk mengakses metode2 yang dimilikinya,
"search" adalah metode yang melakukan proses pencarian informasi di internet,
"q=tes" adalah parameter yang diberikan kepada metode "search" tersebut, dan web service ini dijalankan menggunakan sintax:
http://www.google.co.id/search?q=tes
yang ditulis pada address bar sebuah web browser.
hampir sama kan?

nah, sekarang kita akan buat web service untuk manipulasi gambar, yang dibutuhin:
1.
python2.
PIL (python imaging library)3.
google appengine (tinggal download dan extract)
4. teks editor favorit
5. gambar target, dalam kesempatan ini kita culik aja http://ceknricek.files.wordpress.com/2009/03/aura-kasih-tanktop.jpg >

nah, dokumentasi google appengine image apinya sendiri bisa diliat di
sini, atau dapat didownload dari
sini.
ok, sekarang silakan berkenalan dulu dengan appengine (baca doc, coba tutorial, dsb)
kalau udah, bikin project baru, misal imserv
di dalam project folder, buat file app.yaml dengan contoh isi sebagai berikut:
application: imserv
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
script: imserv.py
abis itu kita mulai ngoding program kita dengan nama file "imserv.py"
implementasi image api dari appengine cukup mudah... kita tinggal import modul2 yang akan kita gunakan
import urllib
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import images
note: disini kita akan mendesign web service dengan metode yang dipanggil via URL menggunakan HTTP GET, jadi URLnya kira2 seperti ini,
http://localhost/resize?src=http://ceknricek.files.wordpress.com/2009/03/aura-kasih-tanktop.jpg&width=32&height=32
untuk itu, saya bikin class dengan nama "Ukuran" yang merupakan turunan dari class "webapp.RequestHandler" dan mendefinisikan 1 metode dengan nama "get", sesuai dengan namanya, metode tersebut berfungsi untuk menghandle setiap request GET yang ditujukan ke URL di atas. berikut codenya:
class Ukuran(webapp.RequestHandler): (1)
def get(self): (2)
foto = urllib.urlopen(self.request.get("src")).read() (3)
x = int(self.request.get("width")) (4)
y = int(self.request.get("height")) (5)
self.response.headers["Content-Type"] = "image/jpeg" (6)
self.response.out.write(images.resize(foto, x, y, output_encoding=images.JPEG)) (7)
penjelasan:
1. pendefinisian class yang merujuk class webapp.RequestHandler sebagai parent classnya
2. pendefinisian metode "get" yang digunakan untuk menghandle setiap GET request
3. baris ini membaca parameter "src" dari URL dan menyimpannya dalam variabel "foto", karena value dari parameternya adalah sebuah URL, maka digunakan metode urlopen untuk membaca seluruh content URL tersebut.
4. baris ini membaca value dari parameter "width" dan menyimpannya dalam variabel x
5. baris ini membaca value dari parameter "height" dan menyimpannya dalam variabel y
6. baris ini mendefinisikan http header dari respon yang akan dikirim
7. baris ini memanggil metode "resize" dari appengine image api dengan memberikan parameter objek gambar dan ukurannya lalu mengirimkan hasilnya ke program lain/user yang melakukan pemanggilan.
setelah itu, kita definisikan mapping URL handler ke class yang baru dibuat;
application = webapp.WSGIApplication([('/resize', Ukuran),], debug = True)
pada baris tersebut, kita membuat satu instance baru bernama "application" dari WSGIApplication dengan memberikan parameter berupa list/array dari mapping antara URL handler dan classnya, kita juga mengaktifkan mode debug.
yang terakhir, kita buat fungsi main() untuk menjalankan web service ini;
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
simpan hasil editan kita, dan jalankan appengine server.
disini saya menggunakan port 80 jadi membutuhkan root akses untuk menjalankannya.
bila tidak ada error pada console, buka web browser dan arahkan ke http://localhost/
pasti tidak ada apa2, karena kita tidak membuat handler untuk root URLnya.
nah sekarang buka URL sample kita :
http://localhost/resize?src=http://ceknricek.files.wordpress.com/2009/03/aura-kasih-tanktop.jpg&width=32&height=32
kalau semua berjalan baik dan tidak ada error, maka hasilnya seperti ini:
note: walaupun kita menentukan ukuran yang diinginkan adalah 32x32, tapi kenyataannya appengine image api akan merubah ukuran gambar sesuai dengan normalisasinya, jadi bisa saja hanya heightnya yang 32 atau hanya widthnya saja yang 32, karena yang dilakukan adalah merubah ukuran layaknya zoom.
ok, sekarang coba implementasikan appengine image api untuk crop, dengan URL yang didesign adalah:
http://localhost/crop?src=http://ceknricek.files.wordpress.com/2009/03/aura-kasih-tanktop.jpg&x0=0.41&y0=0.5&x1=0.7&y1=0.78
well... that's it! image web service ala python & google appengine.