PHP’de Resimleri Yeniden Boyutlandırın ve Değiştirin (Örneklerle)

PHP'de Resimleri Yeniden Boyutlandırın ve Değiştirin (Örneklerle)

Önceki dersimde temel konuları tartışmıştık. PHP GD kitaplığını kullanarak görüntü işleme. Bu eğitimde, kütüphaneye kısa bir giriş yaptım ve PHP’de bir dosyadan nasıl resim yükleyeceğinizi veya sıfırdan nasıl oluşturacağınızı gösterdim. Bundan sonra, GD kullanarak bir görüntüyü nasıl kırpacağımızı, döndüreceğimizi, ölçekleyeceğimizi ve çevireceğimizi öğrendik. ben kapattım imagefilter() komut dosyasına yüklenen görüntü kaynaklarına farklı filtreler uygulama işlevi. Ayrıca GD’deki bazı yararlı işlevlerden de bahsetmiştim. imagesx() ve imagesy() yüklenen görüntünün genişliğini ve yüksekliğini almak için.

Son GD eğitimimin sonunda, bir dizindeki tüm görüntüleri yeniden boyutlandırmak veya nihai sonucu kaydetmeden önce üzerlerine gri tonlama gibi filtreler uygulamak gibi temel görevleri otomatikleştirmek için kitaplığı nasıl kullanacağınızı öğrendiniz. PHP GD kütüphanesini daha önce hiç kullanmadıysanız, bunu gözden geçirmenizi öneririm. GD tanıtım makalesi bunu okumadan önce.

Bu eğitimde, GD’deki daha birçok kullanışlı işlevi ve bunların daha fazla görüntü işleme görevlerimizi otomatikleştirmek için nasıl kullanılabileceğini öğreneceğiz.

Bir Evrişim Matrisi Kullanarak Görüntüleri Manipüle Etme

Kenarlardaki pikseller dışında, bir görüntüdeki her piksel, diğer sekiz pikselle çevrilidir. Bu pikselin değerine ve çevresindeki piksellerin değerlerine bağlı olarak her piksel için bulanıklık veya kenar algılama gibi efektler hesaplanır. Örneğin, kenar algılamada renkteki keskin bir değişiklik, görüntüdeki bir nesnenin kenarına ulaştığımızı ima eder. Örneğin, aşağıdaki resimde beyazdan kahverengiye ani bir değişiklik, fincan ve masanın sınırını belirtecektir.

Bu tür bir filtreyi belirlemenin kolay bir yolu, “evrişim matrisi” olarak adlandırılan şeydir. GD sağlar imageconvolution( $image, $matrix, $div, $offset) bir görüntü kaynağına 3×3 evrişim matrisi uygulama işlevi $image.

bu $matrix parametresi, her biri üç kayan değer içeren üç diziden oluşan bir dizidir—yani, 3×3’lük bir matristir. İlk dizinin ilk elemanı, sol üst pikselin renk değeri ile çarpılır. Benzer şekilde, birinci dizinin ikinci elemanı, doğrudan merkezi pikselin üzerindeki pikselin renk değeri ile çarpılır. Pikselin son rengi, tüm bu çarpmaların sonucunun eklenmesi ve ardından bölünmesiyle elde edilir. $div normalleşme için. Normalleştirme genellikle son renk değerini 255’in altında tutar.

Gördüğümüz gibi, $div parametre değerini normalleştirmek için evrişim sonucu için bir bölen olarak kullanılır. bu $offset parametre ise tüm renkler için bir ofset değeri belirtmek için kullanılır. Aşağıdaki örneklerde nihai sonucu nasıl etkilediğini göreceksiniz.

Evrişim Örnekleri

Masadaki bir fincan görüntüsüne uyguladığımız bazı farklı evrişim matrislerinin bir listesi.

Kutu bulanıklığı

Kutu bulanıklaştırma, her pikselin komşularıyla ortalamasını alarak çalışır. Üç dizideki tüm öğelerin toplamı 9 olduğu için bölenin değerini 9’a ayarladık.

Keskinleştir

Keskinleştirme, her piksel ve komşuları arasındaki farkları abartarak çalışır. Bu, kenarları biraz daha net hale getirir. Keskinleştirme durumunda, bölen hala 1’dir çünkü üç dizideki tüm öğelerin toplamı 1’dir.

kabartma

Kabartma matrisi, keskinleştirme matrisine benzer, ancak değerlerin sol üstte negatif ve sağ altta pozitif olması dışında – kabartma efektini yaratan budur. Kabartma evrişim matrisi durumunda tüm öğelerin toplamı 1’dir, bu nedenle normalleştirme veya renk kayması konusunda endişelenmemize gerek yoktur.

Kenar Algılama

Kenar algılama keskinleştirmeye benzer, ancak etkisi daha da güçlüdür. Ayrıca, görüntünün orijinal değerine komşulardan daha fazla ağırlık verilmez; bu, orijinal düz renkli alanları değil, yalnızca kenarları önemsediğimiz anlamına gelir.

Kenar algılama ile tüm dizi elemanlarının toplamı 0’dır. Bu, genellikle nesnelerin kenarlarında meydana gelen keskin bir renk değişikliği olmadıkça alacağımız görüntünün çoğunlukla siyah olacağı anlamına gelir. Çoğunlukla siyah olan görüntü, offset parametresi 255 olarak ayarlanarak beyaza çevrilebilir.

Aşağıdaki görüntü, tüm bu evrişim matrislerinin sonucunu göstermektedir.

Görüntü Kopyalama İşlevleri

PHP GD, bir görüntünün bir kısmını kopyalamak ve ardından onu yeniden boyutlandırmak veya birleştirmek için birçok fonksiyona sahiptir. Bu işlevleri kullanırken, PHP’nin bir görüntü kaynağının sol üst köşesini kaynak olarak kabul ettiğini hatırlamak önemlidir. Bir pozitif x değer sizi görüntünün sağına götürür ve pozitif y değer sizi daha da aşağılara çeker.

Bu fonksiyonların en basiti imagecopy( $dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h). Kaynak görüntüyü bir hedef görüntüye kopyalayacaktır. bu $dst_x ve $dst_y parametreler, kopyalanan görüntünün yapıştırılacağı sol üst köşeyi belirler. bu $src_x, $src_y, $src_wve $src_h parametreler, hedefe kopyalanacak olan kaynak görüntünün dikdörtgen bölümünü belirler.

kullanarak sıfırdan bir görüntü oluşturarak görüntüleri kırpmak için bu işlevi kullanabilirsiniz. imagecreatetruecolor() ve kaynak görüntünün kırpma dikdörtgeninin içine kopyalanması. Ayrıca resimlere filigran eklemek için de kullanabilirsiniz ancak bu yöntemle filigranın boyutunun resimlerimizin boyutuna göre değiştirilemediğini unutmamalısınız.

Bu sorunun çözümlerinden biri, imagecopyresized( $dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) işlev. Tüm parametreleri kabul eder. imagecopy() ve kaynak görüntünün kopyalanacağı hedef alanın boyutunu belirlemek için iki ek parametre.

bu imagecopyresized() görüntüyü çok iyi yukarı ve aşağı ölçeklendirmediğinden işlev mükemmel değildir. Ancak, yeniden boyutlandırmayı kullanarak daha kaliteli bir boyut elde edebilirsiniz. imagecopyresampled() aynı parametreleri kabul eden fonksiyon.

Şeffaf Kopyalama

Görüntü kopyalamayla ilgili çok yararlı bulacağınız iki işlev daha vardır: imagecopymerge() ve imagecopymergegray().

İşlev imagecopymerge( $dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) benzer imagecopy()nerede ek $pct parametre kopyalanan görüntünün şeffaflığını belirler. 0 değeri şeffaflık olmadığı anlamına gelir ve 100 değeri tam şeffaflık anlamına gelir. Ana görüntünün içeriğini filigranınızın arkasına tamamen gizlemek istemiyorsanız bu çok yardımcı olacaktır.

bu imagecopymergegray() işlev ise kaynak görüntüyü gri tonlamaya dönüştürmek için son parametreyi kullanır. 0’a ayarlanırsa, kaynak görüntü tüm rengini kaybeder. 100’e ayarlanırsa, kaynak görüntü etkilenmeyecektir.

Resim Kopyalama Örneği

Aşağıdaki örnek, imagecopy() görüntünün sağ yarısını negatife çevirme işlevi. Gibi diğer işlevleri zaten tartıştık imagefilter() ve imagescale() bu kod parçacığında kullanılan önceki eğitim.

Burada, orijinal görüntünün her biri 800 piksel genişliğe küçültülmüş iki kopyasını oluşturuyoruz. Bundan sonra, kullanıyoruz imagefilter() negatifini yaratma işlevi $img_php_inv görüntü kaynağı. Bu negatif görüntünün sağ yarısı daha sonra orijinal görüntüye kopyalanır. imagecopy() işlev.

Bu çok temel bir kullanımdı. imagecopy() işlev. Sonuçları aşağıda görebilirsiniz. Daha ilginç görüntü efektleri oluşturmak için görüntüyü daha küçük bölümlere veya şeritlere de bölebilirsiniz. kullanacağız imagecopymergegray() orijinal balık görüntüsünde çok daha fazla şerit oluşturmak için aşağıdaki kod parçasındaki işlevi kullanın.

Yukarıdaki kod örneği, önceki örneğe benzer bir strateji kullanır, ancak bu sefer görüntüyü, değişkenin değerine göre gri tonlamaya dönüştürülen veya değişmeden tutulan daha küçük şeritlere böldük. $i. Tüm kopyalama birleştirme işlemlerini tamamladıktan sonra, şeritlerin öne çıkması için görüntüye iki filtre uyguluyoruz.

Aşağıdaki görüntü, farklı görüntü filtreleriyle birlikte bu iki işlevin nihai sonucunu göstermektedir.

Base64 Görüntülerin Kodlanması ve Kod Çözülmesi

Görüntülerle çalışırken, görüntü verilerinin ya Base64 biçiminden kodunun çözülmesi ya da içine kodlanması gereken durumlarla karşılaşmanız olasıdır. Bu görevi gerçekleştirmek için GD kitaplığında doğrudan işlev yoktur. Ancak, bunu kolayca yapmak için diğer bazı PHP işlevlerini kullanabilirsiniz.

PHP GD’de görüntü verilerini döndürecek hiçbir işlev yoktur. Ancak, gibi işlevler imagejpeg(), imagepng()ve imagegif() görüntüyü bir tarayıcıya veya dosyaya gönderebilir. Çıktılarını aşağıdaki gibi bazı çıktı kontrol fonksiyonlarını kullanarak yakalayabiliriz. ob_get_contents(). İşte bir JPEG görüntüsünü Base64 verilerine dönüştürmek için bir örnek.

İlk önce görüntü dosyamızdan yeni bir görüntü nesnesi alıyoruz. imagecreatefromjpeg() işlev. Bundan sonra, kullanıyoruz ob_start() çıktı arabelleğe almayı açma işlevi. bu imagejpeg() işlevi, ikinci parametre olarak bir dosya adı iletmediğimiz için ham görüntü akışını verir. Bu yakalanan veriler daha sonra $image_data kullanarak değişken ob_get_contents() çıktı arabelleğinin içeriğini döndürür. Ham görüntü verisi daha sonra aşağıdaki komut kullanılarak Base64 formatına dönüştürülür. base64_encode() işlev.

PHP GD adlı bir işlevle birlikte gelir imagecreatefromstring() bu, verilen dizedeki görüntü akışından yeni bir görüntü oluşturacaktır. Diyelim ki görüntü verileriniz Base64 ile kodlanmış bir dizide. PHP kullanarak bir resim dosyası olarak kaydetmek için aşağıdaki kodu kullanabilirsiniz.

Base64 dizesinin kodunu çözerek başlıyoruz. base64_decode() orijinal görüntü veri akışını geri almak için. Bu akış daha sonra imagecreatefromstring() resmimizi geri alma işlevi. Bundan sonra, basitçe kullanabilirsiniz imagejpeg() görüntüyü bir JPEG dosyası olarak kaydetme işlevi.

Görüntülere Filigran veya Diğer Bilgileri Gömme

Bazı kuruluşlar, görüntünün sahibi olduklarını açıkça belirtmek için görüntülerine filigran ekler. Ayrıca markanın tanınmasına yardımcı olur ve diğer insanları görüntüleri açıkça kopyalamaktan caydırır. PHP GD sayesinde, resimlere filigran eklemek basit bir iştir.

Yukarıdaki kod parçacığında, kullanarak iki farklı görüntü kaynağı oluşturduk. imagecreatefromjpeg() ana resim için ve imagecreatefrompng() sırasıyla filigran için. Kullanarak ana görüntünün genişliğini ve yüksekliğini belirleriz. imagesx() ve imagesy() fonksiyonlar.

Filigran eklemek istediğiniz tüm resimler aynı boyutlara sahip olmayacaktır. Ana görüntünün boyutlarına göre filigranı yeniden boyutlandırmazsanız, garip görünebilir. Örneğin, 200 piksellik bir filigran 1000 piksellik bir görüntüde iyi görünebilir, ancak 600 piksel genişliğinde bir görüntü için çok büyük olabilir ve 2400 piksel genişliğinde bir görüntüde çok küçük görünebilir.

Bu nedenle, imagescale() filigranı her zaman orijinal görüntü genişliğinin beşte birinde tutma işlevi. Daha sonra kullanırız imagecopy() filigranı doğru yere yerleştirme işlevi. İşte yukarıdaki kod parçacığının nihai sonucu.

Filigranların yanı sıra, fotoğrafın çekildiği yer veya fotoğrafın çekildiği saat gibi başka bilgiler de ekleyebilirsiniz.

Son düşünceler

Önceki öğreticimizde görüntü işlemenin temellerini ele aldıktan sonra, GD kitaplığındaki diğer birkaç yararlı işlevi öğrendik. Eğitimin ilk kısmı, evrişim matrisini kullanarak PHP’deki görüntüleri nasıl değiştirebileceğimizi tartıştı. PHP’nin farklı piksellerin renk değerlerine nasıl ulaştığını anlamanıza yardımcı olmak için evrişim matrisi işlemine ilişkin bazı örnekler de gösterdim.

Eğitimin ikinci kısmı, bir görüntünün bir kısmının başka bir yere yapıştırmak için nasıl kopyalanacağını ve/veya yeniden boyutlandırılacağını açıkladı. Bu, bir görüntüye filigran veya zaman damgası gibi bir şey eklemek istediğimizde kullanışlıdır.

Bazı ilginç görüntü efektleri oluşturmak için tüm bu işlevleri kullanmayı deneyin!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.