Orhan Gazi Kılıç

"Allah'ım sen beni, milletime ve devletime faydam dokunmadan alma"

Resmin Oranını Bozmadan Boyutunu Küçültmek [PHP]

Yazar: Orhan Gazi Kılıç — 24 Şubat 2014 Pazartesi — Saat: 23:14:00

Örneğin bir web projeniz var işiniz resim işlemlerine düştü ve resmin oranını bozmadan çözünürlüğünü düşürmeniz gerekti. Resmin boyutunu düşürmek pek sorun değil ama bunu en boy oranını bozmadan -yani resimdeki insanların kafasını basık ya da uzun göstermeden- yapmak biraz matematik gerektiriyor. Hatırlarsanız lisede bir oran-orantı dersi vardı -tabi dersin adını yanlış hatırlamıyorsam-. İşte bu derste öğrendiklerimiz işimize yarayacak. şimdi bunu php ve gd kütüphanesiyle yapalım.

Önce mantığına biraz bakalım, diyelim ki genişliği 1024px'den büyük olan resimleri genişliği 1024px olacak şekilde küçülteceğiz.
Örneğin kullanıcımız 2048x1536 çözünürlüklü bir resim yükledi ve biz bunu genişliği 1024px olacak şekilde yüksekliğiyle olan oranını bozmadan küçülteceğiz. Bunu yapmak için resmi yüzde kaç oranla küçülteceğiz onu bulalım.Bunun için önce elde edeceğimiz resmin genişliği, gönderilen resmin genişliğinin yüzde kaçı.

Şimdi oran orantıya geri dönecek olursak, elimizdeki resmin genişliği 2048px ve oranına 100% dersek; elde edeceğimiz resmin genişliği 1024px ve oranına x diyerek elde edeceğimiz resimin genişliğinin, gönderilen resmin genişliğinin yüzde kaçı olduğunu buluyoruz. Bu bulduğumuzu da 100'den çıkartınca, resmi 100'de kaç küçülteceğimizi bulmuş oluyoruz. Lütfen önceki bulduğumuz değeri, küçülteceğimiz değer olarak algılamayın, o değer bizim resmimizin verilen resmin yüzde kaçı olduğunu bulmak içindi. Buraya özenle bastırıyorum çünkü ilk yaptığımda ben de burda yanlış yapmıştım :). Bu resim size daha açıklayıcı olacaktır.
Resim ne kadar küçülecek sorusunun cevabı

Yukarıdaki bulduğumuz resmin yüzde kaç küçültüleceğiydi. Şimdi bulmamız gereken hedef yükseklik. Bulmak için resmin yüksekliğinden, "pixel cinsinden ne kadar küçültüleceği" yani ($yukseklik*resmin yüzde kaç küçültüleceği)/100 çıkartmak gerekli. Yani yukardaki işleme devam edersek:
kac_piksel_cikarilacak = (1536*50)/100
hedef yükseklik = 1536-768
hedef yükseklik = 768 olmuş oluyor

Sorunun mantık kısmı bittiğine göre kodlamaya dökebiliriz:

$resim_gecici_yolu = $_FILES['resim']['tmp_name']; //resmimiz
list($genislik,$yukseklik,$tip) = getimagesize($resim_gecici_yolu); //bu fonksiyon gd kütüphanesinin fonksiyonudur ve resmin belirli özelliklerini verir.
$hedef_genislik=1024;
$oran = 100-((1024*100)/$genislik); //yüzde cinsinden küçültülecek oran
$hedef_yukseklik = $yukseklik-(($yukseklik*$oran)/100);
if($genislik<$hedef_genislik)  //eğer genişlik hedef genişlikten küçükse boyutlandırma işlemi yapmadan direkt kaydedeceğiz
{
    switch($tip)
    {
        case '2': $boyutlanacak_resim = imagecreatefromjpeg($resim_gecici_yolu); break;  //tipi jpg ise
        case '3': $boyutlanacak_resim = imagecreatefrompng($resim_gecici_yolu); break;  //tipi png ise
    }
    $kaydet = imagejpeg($boyutlanacak_resim,$yuklenecek_yer,75);  //tipi jpg ise  
    imagedestroy($boyutlanacak_resim); //resmi ram'den sildik
}
else  //yok genişlik hedef genişlikten küçük değilse imagecopyresampled() fonksiyonu ile boyutlandırma işlemi yapacağız
{
    switch($tip)
    {
        case '2': $boyutlanacak_resim = imagecreatefromjpeg($resim_gecici_yolu); break;  //tipi jpg ise
        case '3': $boyutlanacak_resim = imagecreatefrompng($resim_gecici_yolu); break;  //tipi png ise
    }

    $boyutlanmis_resim_ayari = imagecreatetruecolor($hedef_genislik,$hedef_yukseklik);
    $boyutlanmis_resim = imagecopyresampled($boyutlanmis_resim_ayari,$boyutlanacak_resim,0,0,0,0,$hedef_genislik,$hedef_yukseklik,$genislik,$yukseklik);
    $kaydet = imagejpeg($boyutlanmis_resim_ayari,$yuklenecek_yer,75); //tipi jpg ise
    imagedestroy($boyutlanmis_resim_ayari);
    imagedestroy($boyutlanacak_resim); //resmi ram'den sildik
}

PHP ile resim işlemleri için daha fazla bilgi almak için.
Enhanced by Zemanta


#orhangazikılıç #yazılımcı #programcı #mühendis #oyuncu #vatanperver