Php Aracılığı ile Resim Kopyalama


Bu çalışmada bir jpg dosyasındaki içerik tüm renk ve özellikleri ile piksel piksel kopyalanıp bir mozaik tarzında birleştirilerek yeniden oluşturulmaktadır. Piksel renk ve özelliklerini belirleyen bilgiler flash kodları ile alınıp bir php dosyasına gönderilmekte veriler burada işlenerek flash`a iade edilmekte ve bu bilgiler yorumlanarak swf dosyasında bir kopyası yaratılmaktadır. Bu işlemin ne kadar sürede oluştuğu ayrıca resmin üstündeki metin kutusunda saniye cinsinden yazılmaktadır.

Uyarı: Resmin kopyalanması, seçilen alanın boyutu ve kullanıcının bağlantı hızı ile ilintili olduğundan kopyalanma süresi bazen 45 sn civarında olmaktadır. Bu nedenle test amacı ile butona bastığınızda yeni resmin oluşmasını beklemeniz gerekecektir.

Çalışmada resim üzerindeki seffaf klip boyutlarında kopyalama yapılır. Bu kopyalama aracı olan klibin yerini fare ile çekerek değiştirebilir , boyutlarını zoom in ve out butonları ile büyültüp küçültebilirsiniz. Örnek dosya David Vogeller`in Macromedia Flash Professional 8 Unleashed isimli kitabından alıntıdır

DOSYAYI İNDİR

Uygulama: Dosyanın hazırlanmasında bir zorluk yoktur. Asıl çalışmayı kodlar ve php dosyası sağlamaktadır. Önce sahneye kopyalanacak resim dosyasını import edin. Resmi seçip F8 tuşuna basın ve film klibine dönüştürün. İnstance name kısmına img_mc yazın. Klibin üzerine 40*40 piksellik bir dikdörtgen çizin yalnız çizimin iç dolgusunu altta seçilen resmi görebilmek için transparan beyaz renkle doldurun. Bu dolguyu yapabilmek için Color Mixer panelindeli alfa değer alanını kullanın. Bu çizimi seçip film klibi yapın ve instance name kısmına dragger_mc yazın. Sahneye 3 buton component yerletirin. Biri çizimin kopyalanması diğer ikisi zoom in ve out için kullanılacaktır. Bunlara sırası ile ci_btn, zF_btn, zB_btn ismini atayın. Son olarak resmin kopyalanacağı alan için bir klip hazırlanacaktır. Resmin hemen yanında 85*105 piksellik bir dikdörtgen çizin bunun üst kenarına dinamik bir metin kutusu yerleştirin(instance name=info_txt) sonra hem çizimi hem metin kutusunu seçip film klibi yapın.Klibin instance name kısmına target_mc yazın. Hazırlanacak tüm elemanlar bunlardan ibarettir.

Şimdi 1.kareyi seçip actionscript panelini açın ve şu kodları ekleyin:

//Başlangıç değişkenleri atanıyor
var myPath = "mapImage.php"; //php script yolu
//Sürüklenebilen klibin sınırları tesbit ediliyor.
var l = img_mc._x; //Sol sınır:Kopyalanacak klibin sol kenar sınırı
var t = img_mc._y; //Üst sınır:Kopyalanacak klibin üst kenar sınırı
var r = l+img_mc._width; //Sağ sınır:Kopyalanacak klibin sağ kenar sınırı
var b = t+img_mc._height; //Alt sınır:Kopyalanacak klibin alt kenar sınırı
var maxZoom = 100; //Maksimum zoom seviyesi
var minZoom = 20; //Minimum zoom seviyesi
var sTime = 0; //Kullanıcının resmi yeniden çizmek için butona bastığı an

//Yeniden çizilen resim için bir klip yaratılıyor ve yatay ve dikey başlama pozisyonları ayarlanıyor
var drawTarget = target_mc.createEmptyMovieClip("targ_mc",1);
drawTarget._x = 2;
drawTarget._y = 22;

//Renkler elde ediliyor ve yer ve özellikleri ayarlanıyor
ci_btn.onRelease = function(){
sTime = getTimer();
target_mc.info_txt.text = "Çizdiriliyor...";
target_mc.targ_mc.clear();
colors_lv.sentX = 4*(dragger_mc._x - img_mc._x);
colors_lv.sentY = 4*(dragger_mc._y - img_mc._y);
colors_lv.pixels = dragger_mc._width/20;
colors_lv.sentSize = 80; //80*80 piksellik bir yeniden çizim planlanıyor
colors_lv.sendAndLoad(myPath,colors_lv,"POST");
}

//Her pikselin yerleşim yerini kontrol eden çizim fonksiyonu ve çizimin bitiş süresi hazırlanıyor
function buildPic(arr){
target_mc.targ_mc.lineStyle(0,0x000000,0);
var i = 0;
var tLength = arr.length;
while(i<tLength){
var j = 0;
var t_array = arr[i].split("~~");
t_array.shift();
var ttLength = t_array.length;
while(j<ttLength){
drawRec(j,i,t_array[j]);
j++;
}
i++;
}
target_mc.info_txt.text = Math.round((getTimer()-sTime)/100)/10 +" saniye";
}

//Bir dikdörtgen olarak çizilen her piksel kontrol ediliyor
function drawRec(sX,sY,clr){
with(target_mc.targ_mc){
beginFill(clr,100);
moveTo(sX,sY);
lineTo(sX+1, sY);
lineTo(sX+1,sY+1);
lineTo(sX,sY+1);
lineTo(sX,sY);
endFill();
}
}
//Zoom in fonksiyonları hazırlanıyor.
zF_btn.onRelease = function(){
if(dragger_mc._width<maxZoom){
dragger_mc._width = dragger_mc._height += 20;
if(dragger_mc._x > (r-dragger_mc._width)){
dragger_mc._x -=20;
}
if(dragger_mc._y > (b-dragger_mc._height)){
dragger_mc._y -=20;
}
}
}

//Zoom out fonksiyonları hazırlanıyor
zB_btn.onRelease = function(){
if(dragger_mc._width>minZoom){
dragger_mc._width = dragger_mc._height -= 20;
}
}

// "mapImage.php" ile bağlantı kuran nesne oluşturuluyor
var colors_lv = new LoadVars();
colors_lv.onLoad = function (success){
if(success){
var allLines = this.colors.split("NL");
buildPic(allLines);
}else{
target_mc.info_txt.text = "HATA !";
}
}

//Sürükleme için komutlar oluşturuluyor
dragger_mc.onPress = function(){
this.startDrag(false, l,t,r-this._width,b-this._height);
}
this.onMouseUp = function(){
stopDrag();
}
//Klip sonu

 

Şimdi mapImage.php isimli php dosyasını içeriğine bakalım:

<?php

//flash`tan gönderilen resim verileri alınıyor
$pixels = $_POST['pixels'];
$startX = $_POST['sentX'];
$startY = $_POST['sentY'];
$mSize = $_POST['sentSize'];

//Bu fonksiyonla resimdeki tüm renkler elde ediliyor
function getColor($pth, $pixs, $sX, $sY,$maxSize){
$fullSize = $pixs*$maxSize;

$myImage = @imagecreatefromjpeg ($pth);

$sendStr;

for($j=$sY;$j<$sY+$fullSize;$j+=$pixs){
for($i=$sX;$i<$sX+$fullSize;$i+=$pixs){ //$i = x ... $j = y
$clr = imagecolorat($myImage, $i, $j);
$sendStr .= "~~" . $clr;
}
$sendStr .= "NL";
}
return $sendStr;
}

echo "colors=" . getColor("candy.jpg",$pixels,$startX,$startY,$mSize);

?>

Şayet php dosyanızla swf dosyanız aynı dizinde olmayacaksa kodlara bu yolu doğru girmeye dikkat edin. Serverınızda flash içine alınan candy.jpg dosyanızı, php dosyanızı swf ve html dosyanızı aynı dizinde yerleştirip çalışmanızı deneyebilirsiniz.