Android Kamera Kullanılarak Fotoğraf Elde Edilmesi

Android işletim sisteminin kamera uygulaması kullanılarak fotoğraf\/video gibi çeşitli görsel bileşenler elde edilebilmektedir. Tipik olarak bir resim işlemi için ImageView kontrolü kullanılabilir. Resim elde etmek için gereken Intent action ismi MediaStore.ACTION_IMAGE_CAPTURE sabitinde bulunmaktadır. Bu eleman var olan kamera uygulamasının fotoğraf çekme kısmının açılmasını sağlayarak işlemleri yapar. Bu intent için startActivityForResult metodu ile çekilen resim "data" anahtarına sahip veri içerisinden elde edilebilir.

Bu işlemin yapılabilmesi için android.permission.CAMERA izni eklenmelidir. Bu işlem Android 6.0 ve üstü için tehlikeli(dangerous) bir izindir, dolayısıyla çalışma zamanı izni(runtime permission) gereklidir.

Kamera uygulamasından alınan resim android.graphics.Bitmap sınıfı türündendir.

Resmi onActivityResult içerisinde elde etmek basit olarak şu şekilde yapılabilir.

 if (requestCode == REQ_IMAGE_CAPTURE && resultCode == RESULT_OK)
 {
     m_bitmap = (Bitmap)data.getExtras().get("data");
    m_bitmap = Bitmap.createScaledBitmap(m_bitmap, 500, 500,true);
    m_imageViewPhoto.setImageBitmap(m_bitmap);
 }

Bu işlemde bitmap gerçek boyutuyla elde edilmez. Resmin boyutlarını değiştirmek için(resampling) createScaledBitmap isimli metot kullanılabilir. Metodun 1. parametresi kaynak Bitmap referansı, 2. ve 3. parametreleri sırasıyla yeni elde edilecek boyutlar, son parametresi ise filtreleme uygulanıp uygulanmayacağıdır. Bu parametre genelde true geçilir.

091-CaptureImage

Bitmap Sınıfının Ayrıntıları

Bitmap sınıfı bir görüntüyü temsil eden sınıftır. Bilindiği gibi görüntü ismine pixel(picture element) denilen elemanlardan meydana gelen bir matris gibi düşünülebilir. Bir Bitmap nesnesinin yüksekliği ve genişliği getHeight ve getWidth isimli metotlarla elde edilebilir.

Kamera uygulamasıyla elde edilen Bitmap nesnesi içeriği değiştirilemez(immutable) durumdadır. Dolayısıyla kamera ile elde edilen resim üzerinde, bitmap üzerinde doğrudan değişiklik yapılamaz. Bunun için Bitmap sınıfının copy isimli metodu ile resmin bir kopyası değiştirilebilir olarak çıkartılmalıdır. copy metodu resmi dönüştürebilirse yeni bir Bitmap nesnesine ilişkin referansla dönüştüremezse "null" değeri ile geri döner. Geri döndürdüğü Bitmap orjinali ile aynı yoğunluğa sahiptir.(width\/height değerleri) Metodun 1. parametresi Bitmap.Config enum türündendir. Bu parametre ilgili resmin piksel değerlerine ilişkin belirleme yapmak amaçlı kullanılır. Özel bir durum yoksa, RGB_565 olarak seçilebilir.

copy metodunun 2. parametresi üretilecek resmin değiştirilebilir yada değişitirilebilir olmamasıdır. true geçilirse değiştirilebilir bir resim üretilir yani pikseller üzerinde değişiklik yapılabilir. Bir Bitmap nesnesinin herhangi bir piksel değeri getPixel isimli metod ile elde edilebilir. getPixel metodu aldığı piksel kordinat parametrelerindeki pixel bilgilerine ilişkin int bir değer döndürür. Bu değer android.graphics.Color sınıfına ilişkin int türden değerdir. Pixel değerlerine ilişkin Alpha, Red, Green, Blue değerleri sırasıyla Alpha, Red, Green, Blue static metotları ile elde edilebilir. Benzer şekilde Color sınıfının ARGB veya RGB isimli metotları ile ilgili pixel değerlerinden Color bilgisine ilişkin birleştirilmiş int değer elde edilebilir.

Bitmap sınıfının setPixel metodu ile ilgili pixel değeri değiştirilebilir. Aşağıdaki gibi bir döngü ile tüm resim dolaşılabilir.

```

```

092-MakeGrayScaleCapturedImage

Bu uygulamada resmi GreyScale ve Siyah\/Beyaz yapan metotları olan bir bitmap operation sınıfı eklenmiştir, diğer görüntü işlemeye ilişkin kavramlar metod olarak buraya eklenebilir.

threshold = eşik değeri Buradaki treshold değeri istenildiği gibi belirlenebilir. Bu uygulamada resmin kendisini data olarak kaydetmiyoruz.

Bu resmi diske kaydetmek için, 2 yöntemden biri tercih edilebilir. 1. Resim kamera ile çekildikten sonra kamera programı tarafından diske kaydedilecek şekilde tasarlanır. 2. ImageView kontrolünde kullanılan Bitmap diske kaydedilebilir. Burada birinci yöntem resmin daha kaliteli elde edilmesini sağlar. Bu işlemi yapabilmek için çekim intent nesnesine kaydedilecek yol ifadesinin verilmesi gerekir. Şöyle bir işlemle yapılabilir.

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(m_destination));

Kamera uygulaması yol ifadesi verildiğinde artık data olarak kaydetmez. Bu durumda resim kaydedilen yerden alınmalıdır. Bunun için aşağıdaki gibi bir algoritma kullanılabilir.

Anahtar Notlar: Android Studio IDE programında Gradle Scripts seçeneğinden, build.gradle(app modülü) dosyasından default config içerisindeli minSdkVersion ve targetSdkVersion API seviye numarası verilerek değiştirilebilir.

093-FullImageCaptureandOperations

BitmapFactory sınıfının decodeStream metodu ile bir dosyadan, bir Bitmap nesnesi elde edilebilir. Bu sınıfın 3. parametresi elde edilecek Bitmap'e ilişkin çeşitli belirlenen değerlerdir, default geçilirse(def. cons. ile nesne yaratılırsa) görüntünün birebir aynısı elde edilir.