Processing: QR_STENCILER

Güncelleme Yayın

Free Art and Technology Lab (F.A.T.)1 için processing üzerinde Golan Levin ve Asa Foster III tarafından geliştirilmiş2 olan bir araç takımı. Takım içerisinde yer alan class’lar farklı yapıları bir araya getirerek, qr_stenciler ile QR kod olarak elinizde bulunan imajları stencil kalıplarına dönüştürebilirsiniz3.

Qrst 5

İmajlar ihtiyacınıza uygun olarak köşelerini yumuşatılmış (rounded corner) ve siyah üzerine beyaz ya da beyaz üzerine siyah vb. olacak şekilde *.pdf çıktılar halinde derleniyor.

Cp5 Controllers

controlP5

Github üzerinden geliştirmelerde de bulunabileceğiniz uygulama Processing 1.5.1 sürümünde sorunsuz çalışıyor. Uygulamayı çalıştırmadan önce Andreas Schlegel4 tarafından geliştirilen arayüz kütüphanesi controlP5'nin yüklü olduğundan emin olmalısınız5. QR_STENCILER/data/ içerisine yerleştireceğiniz qr imajlarınızı Google tarafından ücretsiz olarak sunulan goo.gl servisi (sadece bağlantılar için), yine ücretsiz bir servis olan goqr.me6 veya ücretli olarak kaywa7 üzerinden sağlayabilirsiniz.

Diğer Uygulamalar

Free Art and Technology Lab tarafından gerçekleştirilen diğer çalışmalardan8 biri olan ve QR_STENCILER içerisinde de yer alan QR_HOBO_CODES da ayrıca ilginizi çekecektir. Hobo’lar ve kodları ile ilgili detaylı bilgi almak için hobo9 bağlantısını inceleyebilirsiniz. Ek olarak, Processing QRCode Library10 ile işlemler gerçekleştirmeniz de mümkün. Örnek olarak aşağıda metin olarak hazırlanmış bir qr kod üzerinden imaj gösterebileceğimiz bir sketch yer almakta. Codebox: Use QR codes in Processing11 başlığı altında makezine tarafından paylaşılan çalışma için ihtiyacınız olan tüm bağlantıları aşağıda iletiyorum.

  1. ZXing (“zebra crossing”) açık kaynaklı, çoklu format 1D/2D barkod işleme kütüphanesi12
  2. Derleme işlemi ile uğraşmamak adına hazır olan javase.jar ve core.jar dosyaları13 (indirip, Processing > Sketch > Add File ile eklemelisiniz)
  3. Sketch dosyası qr_codes.pde
QR Scanning

Döküman içerisinde yer alan sketch üzerine birkaç düzenleme yapmam gerekti. Özellikle setup içerisinde webcam aktifleştirilmediği için muhtemelen sadece canvas görüntüleyeceksiniz. Diğer düzenleme ise getImage()14 ile ilgili alacağınız uyarıya istinaden getNative()15 kullanmış olmam.

import processing.video.*;
import com.google.zxing.*;
import java.awt.image.BufferedImage;

Capture cam; //Set up the camera
com.google.zxing.Reader reader = new com.google.zxing.qrcode.QRCodeReader();

int WIDTH = 640;
int HEIGHT = 480;

PImage cover;  //This will have the cover image
String lastISBNAcquired = "";  //This is the last ISBN we acquired

// Grabs the image file

void setup() {
  size(640, 480);
  cam = new Capture(this, WIDTH, HEIGHT);
  cam.start();
}

void draw() {
  if (cam.available() == true) {
    cam.read();
    image(cam, 0,0);
    try {
       // Now test to see if it has a QR code embedded in it
       LuminanceSource source = new BufferedImageLuminanceSource((BufferedImage)cam.getNative());
       BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
       Result result = reader.decode(bitmap);
       //Once we get the results, we can do some display
       if (result.getText() != null) {
          println(result.getText());
          ResultPoint[] points = result.getResultPoints();
          //Draw some ellipses on at the control points
          for (int i = 0; i < points.length; i++) {
            fill(#ff8c00);
            ellipse(points[i].getX(), points[i].getY(), 20,20);
          }
          //Now fetch the book cover, if it is found
          if (!result.getText().equals(lastISBNAcquired)) { // 9780596510510
             String url = result.getText();
             try {
                cover = loadImage(url,"gif");
                lastISBNAcquired = result.getText();
             } catch (Exception e) {
               cover = null;
             }
          }
          //Superimpose the cover on the image
          if (cover != null) {
            image(cover, points[1].getX(), points[1].getY());
          }
       }
    } catch (Exception e) {
//         println(e.toString());
    }
  }
}