AS3 Core Library (as3corelib) ile Görsel Kaydetme
Yazar : E.Altuğ YILMAZ
Merhaba arkadaşlar ;
Bugün size AS3 Core Library 'den bahsetmek istiyorum. Sizinde bildiğiniz gibi internet üzerinde birçok flash için geliştirilmiş class dosyaları mevcut ve bizler bu class'ları çalışmalarımıza import ederek gerekli metodlarıyla kullanabiliyoruz. En meşhur olanlarından biri papervision3D olarak belirtebilirim. Flash içerisinde olmayan 3Boyutlu uygulamaları çeşitli matematiksel işlemlerle veya video çekimleriyle sağlayan bu class altyapısı için sitesindeki demolara göz atabilirsiniz. Özellikle 360 derecelik altta gösterdiğim kamera ile çeşitli açılarla eş zamanlı çekilen videolarla olan etkileşimli flash video uygulaması muazzam olmuş.
Benim size bahsetmek istediğim AS3 Core Library , Actionscript üzerine geliştirilen JSON ile iletişim ve image işleme sınıflarını da barındıran bir class yapısı. Bu class ile flash içerisinde o an bulunan bir görseli ziyaretçi bilgisayarına veya servera kaydedebiliyorsunuz. Öncelikle bu işlemler için as3corelib kütüphanesini alttaki adresten indirip ClassPath olarak mesela çalışmanız fla dosyasının yanına com klasörünü eklemeniz gerekiyor. FLA çalışmanızda ilk satırda
import com.adobe.images.JPGEncoder
diyerek o classı classpath denen ya çalışmanız fla adresinin yanına ya da C:\Program Files\Adobe\Adobe Flash CS4\en\First Run\Classes/ klasörünün altına (ki burası default MovieClip,Date,Array,Math classlarınızın bulunduğu adrestiir) kopyalamanızdır.
http://code.google.com/p/as3corelib/
AS3 Core Library kullanarak Draw API'lerle çizdirdiği bir resmin çıktısını almayı anlatan Henry Jones , bu örnekle benim anlatacağım Webcam örneğine çok benzeyen şekilde kullanmış ona da göz atabilirsiniz.
http://henryjones.us/articles/using-the-as3-jpeg-encoder
Ben Türkçe bir uygulama aradım biraz googling ile ama JSON dışında AS3 Core Library'i anlatan olmamış.Ben kısaca kodu anlatayım. kopyala fonksiyonu 3 adet parametre alıyor.Bunlar m:MovieClip sahneden alabileceğiniz ve görsel olacak movieclip instance name'i.q kalite karşılık geliyor 100 üzerinden görsel kalitesi ve çıkacak dosyanın adı.
import com.adobe.images.JPGEncoder;
function kopyala(m:MovieClip, q:Number, fileName:String)
{
var jpgSource:BitmapData = new BitmapData (m.width, m.height);
jpgSource.draw(m);
var jpgEncoder:JPGEncoder = new JPGEncoder(q);
var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
var jpgURLRequest:URLRequest = new URLRequest ("jpg.php?name=" + fileName + ".jpg");
jpgURLRequest.requestHeaders.push(header);
jpgURLRequest.method = URLRequestMethod.POST;
jpgURLRequest.data = jpgStream;
var jpgURLLoader:URLLoader = new URLLoader();
navigateToURL(jpgURLRequest, "_blank");
}
Buraya kadar jpg.php dosyasının yardımıyla sahnemizde bulunan bir MovieClip'i bir jpeg olarak kaydettirecek fonksiyonu tamamladık. jpg.php dosyasının içeriği de :
if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
{
$jpg = $GLOBALS["HTTP_RAW_POST_DATA"];
header('Content-Type: image/jpeg');
header("Content-Disposition: attachment; filename=".$_GET['foto']);
echo $jpg;
}
Şimdi bir webcam görüntüsü almak istiyoruz düye düşünelim.Yoksa sahnedeki herhangi bir movieclipte olabilir. Webcam görüntüsü için
var video1:Video=new Video();
var kamera:Camera=Camera.getCamera();
video1.attachCamera(kamera);
addChild(video1);
kodları yeterli olacaktır.Ancak video1 bir video objesi olduğundan onu da kopyala fonksiyonumuz Movie Clip nesnesi parametre aldığından video1_mc adlı bir movieclip içerisine getireceğim kod biraz uzayacak ama mantık aynı.
var video1:Video=new Video();
var kamera:Camera=Camera.getCamera();
video1.attachCamera(kamera);
var video_mc:MovieClip = new MovieClip()
addChild(video_mc);
video_mc.addChild(video1);
ziyaretçi ekranında çıkacak uyarı:(2 farklı webcam varsa dışarıdan takılan ilk çalışır bu ekrandan ziyaretçinin değiştirmesi lazım biz seçemiyoruz)
ve sonuç :)
Buarada ek bir bilgi Webcam'i anlık bir poz yakalamak için null parametresi gönderiyoruz Foto çekme efektleri yapabilirsiniz alttaki ek kod satırıyla.
video1.attachCamera(null)
Sahneye bir foto_btn ekleyip ona tıklanınca cek fonksiyonuyla kopyala fonksiyonuna 3 adet parametre gönderiyoruz ve anasahnedeki video1_mc instance name'ine sahip MovieClip'i %90 kalitede foto adıyla kaydediyor.
foto_btn.addEventListener(MouseEvent.CLICK,cek)
function cek(e:Event)
{
kopyala(video_mc, 90, "foto");
}
İşte bir webcam görüntüsünü kaydeden bir uygulamamız bu kadardı.Ayrıca ziyaretçinizin kaydettiği bu görseli kendi serverınıza da ziyaretçiye seçtirerek File Reference metoduyla yükletebilirsiniz. File Reference hakkındaki yazım için :
http://ercanaltug.blogspot.com/2009/05/flash-icerisinden-dosya-yukletmek-file.html
Faydalı olması dileğiyle...
24/5/09
böyle bir uygulamayı yaklaşık bir ay önce yapmıştım (dosya kaydetme ve yükletme) uzun araştırmalar yapmak zorunda kalmıştım çünkü Türkçe kaynak yoktu. Uğraşa uğraşa çözdüm sonunda...
Sizin bu konuya el atıp açıklayıcı bir makale yazmanız gerçekten sevindirici. Değinilmemiş konulara değinmeniz gerçekten blogunuza bağımlı kılıyor insanı :)
teşekkürler...
9/8/09
Hocam iyi geceler diliyorum.
Bende buna yakın bir uygulama yaptım ancak ek olarak yapmaya çalıştığım ve beceremediğim bir şey var. Ekran görüntüsü üstünde sabit bir imza olmasını gözükmesini ve bu imajı kaydettiğimizde imzayla beraber kaydedilmesini istedim fakat yapamadım. Yani ekranda imzayı gösterdim fakat resmi kaydettiğimde kaydedilen imajda benim eklediğim imza bulunmuyordu. Sizin bir öneriniz olabilirmi acaba?
9/8/09
Merhaba Uğur
ekran görüntüsü bir movieclip içerisinde sonuçta onun içine addChild edersen o movieclipi kaydettiğinden beraber kaydedecektir. Umarım faydalı olur.
23/2/10
merhaba kaydedilen resmi sunucuya upload ettirmek istiyorum ama php ile alamadım yardımcı olurmusunuz
türkçe çeviri içinde teşekkürler
24/2/10
var jpgStream:ByteArray = jpgEncoder.encode(jpgSource); // resmin datası
var dosya:FileReference = new FileReference();
dosya.data= jpgStream;
var adres:URLRequest = new URLRequest();
adres.method = URLRequestMethod.POST;
adres.url = "jpg_encoder_download.php";
dosya.upload(adres, fileName);
resmi upload ettiremiyorum hata veriyor
filereferance import ettim
16/6/10
Peki görüntü almak yerine bu görüntüyü kaydetmek istersek ne yapmamız gerek?
16/6/10
Selamlar verdiğim ilk adreste dosyayı flash kaydedemeyeceğinden(server tarafında birşeyler yapamaz flash) php ile verilen bir uygulama var ondan faydalanabilirsin. O kodları .net çevirip kullanmışlığım vardı bir projede.