internet pencereler Android
Genişletmek

PHP görüntüleri ile çalışır. PHP için tam görüntü yük kılavuzu

Makale, web sayfalarındaki görüntüleri dinamik olarak oluşturmanıza olanak tanıyan PHP - GDLIB uzantısıyla nasıl çalışılacağı açıklanmaktadır.
Yazar - NYKOH (Niko)
Fransız - çeviri - Anton Fedorchenko
Orijinal adresi - http://www.phpdebutant.org/article111.php

Bu makaleyi anlamak için, PHP'nin temel temelleri hakkında bir fikre sahip olmak ve görüntülerle çalışmanız gerekir.

Tercüman notu

Örneklerde, tüm tanımlayıcı adları Fransızca'da verilmiştir. Okuyucunun kod anlayışını kolaylaştırmak için çevirilerini sunuyoruz:
blanc - Beyaz
bleu - Mavi
couleur - Renk
couleur_fond - arka plan rengi
fichier - Dosya
gris - Gri
hauteur - Yükseklik
hauteurImage - Görüntü Yüksekliği
geniş - Genişlik
geniş Alanı - Görüntü Genişliği
mOIS - ay
noir - Siyah
polis - Yazı Tipi Kulaklık
rouge - Kırmızı
tablo - Dizi
vert - Yeşil

Tercüman notu

Varsayılan olarak, PHP 5'te, Dinamik görüntüler oluşturmak için bir uzantı da dahil olmak üzere tüm uzantılar devre dışı bırakılır. Bu genişlemeyi ayarlama talimatları için bir makaleye başvurmalısınız.

Hedef: Dinamik görüntü oluşturma için tasarlanmış GD kütüphanesinin çeşitli fonksiyonlarının kullanımını öğretmek.

GD kütüphanesi, görüntülerle çalışmak için bir özellik kümesidir. Onun sayesinde, sadece kendi resimlerinizi dinamik olarak oluşturmak için değil, aynı zamanda bunlarla ilgili çeşitli bilgiler almak için, boyutunu vb. Değiştirin.

Dikkat: İşe başlamadan önce, bir şey bilmeniz gerekir. Gerçek şu ki, bu PHP uzantısının birkaç farklı versiyonunun olması ve barındırma hizmeti sağlayıcıların belirli işlevleri ve hatta tüm GD kütüphanesini devre dışı bırakabilir. Ne amaçla? Görüntü işlemenin sunucudaki büyük bir yük olduğu bilinmektedir.

Öyleyse, kullandığınız barındırma için yüklü olan GD kütüphanesinin sürümünü bilmeniz ve yanı sıra izin verilen fonksiyonlar hakkında bilgi edinmeniz gerekir. Yapılması gereken ilk şey, phpinfo işlevini kullanmaktır. Aşağıdaki komut dosyasını gerçekleştirin:

phpinfo.php.

phpinfo ();
?>

Buna benzer bir tablonuz varsa - her şey yolunda (özellikle kütüphane sürümü 2.0'dan daha yeni ise)

Gd.

Gd desteği

GD versiyonu.

Freetype Desteği

FreeType Bağlantısı.

Jpg desteği

Png desteği

WBMP desteği

Yukarıda belirtildiği gibi, bazı olasılıklar devre dışı bırakılabilir. Bu durumda, sadece bir işlev kullanmayı denemelisiniz. Bu bir hataya yol açarsa: Ölümcül hata: Tanımsız işlevi arayın, - bu işlevin devre dışı bırakıldığından şüphelenmemelisiniz.

İ) tuval oluşturulması

İlk önce boş tuval oluşturmanız gerekir. Hemen bu makalede, yalnızca PNG veya JPG formatındaki görüntülere söyleyeceğini açıkça açıklayın, GIF formatı bizim dikkatimiz olmadan kalacaktır. Gerçek şu ki, bu formatın GD kütüphanesi tarafından desteklenmesi, sürüm 1.3 ile başlayarak, GIF için sınırlı destek sürüm 2'de tekrar ortaya çıkmasına neden olmuştur. Sonuç: PNG formatı GIF'ye karlı bir alternatiftir.

Önemli Not

Www.phpdebutant.org sitesinin tüm eğitim kurslarında, komut dosyaları HTML sayfalarının dinamik oluşturulmasını hedefliyorlardı. Bu sefer GD kütüphanesini kullanarak, görüntüler oluşturur, bu durumda yankı ve yazdırmanın tasarımı sırasında unutmanız gerekir. Varsayılan olarak, PHP komut dosyası, özel bir http çekirdeğini gönderme biçiminde açıklama gerektirmeyen bir HTML sayfası oluşturur. Ancak bir görüntü oluşturursak, komut dosyasının başında, örneğin PNG: başlık için ("İçerik Türü: Görüntü / PNG") için karşılık gelen başlığı göndererek türünü belirtmeniz gerekir;

Diğer eylemler bir grafik editörü ile bir şey hatırlattı. Yeni bir resim oluşturur, boyut belirler, arka plan rengini seçin ve istediğiniz formatta kaydedin. Bu eylem dizisi aşağıdaki komut dosyasını göstermektedir:

imageVide.php.

Başlık ("içerik türü: görüntü / png");
$ im \u003d ImageCreate (200, 100)
yada öl ();
$ couleur_fond \u003d imagecolorallocate ($ IM, 255, 0, 0);
İmagePng ($ im);
?>

Bu küçük komut dosyası kırmızı bir dikdörtgen oluşturur (çok mütevazı, ama iyi bir başlangıç). Mekanizmanın açıklaması:

  • ImageCreate işlevi $ IM tanımlayıcısını döndürür. $ IM tanımlayıcısı tüm resim çizim fonksiyonlarına iletilmelidir. ImageCreate işlevi parametreleri, oluşturulan görüntünün uzunluğuna ve genişliğine karşılık gelir (200x100).
  • Operatörün görevi veya kalıp - olası hataların etkisi.
  • ImageColorAlocate işlevi kullanılarak renk oluşturulabilir. İçin kullanılır
    • kullanım için bir değişkende renk oluşturulması ve korunması
    • $ IM görüntü paletine renk ekleyin

Parametreleri, rengin kırmızı, yeşil ve mavi bileşenlerine karşılık gelir ve 0 ila 255 arasındaki tam sayıları temsil eder. Bu örnekte, kırmızı bir renk yarattık.

Önemli Not

bu renk, arka plan rengine karşılık gelir, çünkü ilk önce görüntü paletine eklenir.

Bir ImageVide.php komut dosyasını (BOŞlı_ .PHP) çağırmak, PNG formatında bir resim oluşturur. Web sitesinde kullanmak için, "Klasik" görüntüler durumunda da davranmanız gerekir.

Oldukça kolay! Bir görüntü oluşturacak komut dosyasının parametrelerini bile iletebilirsiniz (örneğin, arka plan rengi).

Yani çizmeye başlamak için zaten bazı temel bilgilere sahipsiniz. Onları derinleştirmek istiyorsan - işte bazı ilginç özellikler

  • 32 bit görüntü oluşturmak için ImageCreateTusolor'daki ImageCreateTusolor'u değiştirebilirsiniz (fotoğraflar için mükemmel)
  • JPEG formatında bir resim oluşturmak için imagePng işlevi imageJPEG'yi değiştirebilirsiniz (başlıktaki başlık işlevi parametresini değiştirmeyi unutmayın ("içerik türü: görüntü / jpeg").
  • Aşağıda, oluşturulan görüntünün kaydedilebileceğini göreceğiz.

İi) görüntü çizim fonksiyonları

Öncelikle, herhangi bir çizimin koordinat kavramıyla ilişkili olduğunu bilmeniz gerekir, bu nedenle bu makalenin bu küçük paragrafında bu konuda bazı fikirler vereceğiz.
Görüntünün sol üst köşesinde koordinatlar (x \u003d 0, y \u003d 0) ve sağ alt (x \u003d görüntü genişliği, y \u003d görüntü yüksekliği).

Örneğin, 200 piksel başına 100 çözünürlüklü bir görüntü için, koordinatlar şunlar olacaktır:

Görüntü çiziminin farklı özellikleri, koordinatının parametreleri olarak alınır. Onları istenen sırada geçirin. Örneğin, bir dikdörtgen çizmek için, ilgili fonksiyonun iki noktasının koordinatlarını (ImageRectangle) aktarmak gerekir. Birinci noktaların koordinatları, görüntünün sol üst köşesine karşılık gelir, ikinci noktaların koordinatları sağ alt köşeye karşılık gelir. Bağımsız değişimleri karıştırmayın, çünkü bazı fonksiyonlar hatalı sonuçlar verebilir.


İşte çeşitli şekilleri çizmek için gerekli olan fonksiyonların bir listesi ve ayrıca oluşturulan görüntüye metin yerleştirme için.
Her fonksiyon için sözdiziminin ve hedefin kısa bir açıklamasını bulacaksınız.
Her fonksiyon için bir örnek getirmeyi hedeflemiyoruz, burada sadece kısa bir açıklama bulacaksınız. Tablo ayrıca, hangisinin veya başka bir işlevin desteklendiğinden başlayarak kütüphanenin sürümünü belirtir. Bazı fonksiyonların kullanım örnekleri, adanmış resmi kılavuzun bölümünde bulunabilir.

Sözdizimi örneği

Açıklama

Boş bir tuval (256 renk) $ IM $ büyük boy yükseklik ve $ Hauteur genişliği yaratır. (PNG formatı tercih edilir)

Bu özellik, ImageCreate'e benzer ancak görüntünün renginin derinliği 256 renkle sınırlı değildir. (JPEG formatı tercih edilir)

$ Rouge, $ Vert, $ BLEU (055. 255). Detaylar için, ilk bölümde bakınız.

Bir noktada ($ x, $ y), $ l geniş, $ h yüksek ve $ col renginde bir merkezle bir elips oluşturur.

Özdeş imagelipse, ancak elips $ col ile doldurulur

Koordinatlar ($ x, $ Y) ile bir nokta arasında bulunan bir resim üzerinde bir $ Col renk dikdörtgen oluşturur.

Koordinatlar (X1, $ Y1) ile iki nokta arasında geçen bir çizgi rengi $ col alır ve ($ x2, $ Y2)

$ IM'nin görüntüsü, koordinatları $ puan dizisinde ($ points \u003d $ x0, $ points \u003d $ y0, $ points \u003d $ x1, $ points \u003d $ y1, vb.), $ Num_Points - Miktar Bir dizi, $ col - renginde puan.

Aynı imagePolyGo, ancak elips $ col ile doldurulur

Resim $ im bir dikdörtgen, sol üst köşeyi, koordinatları ($ x0, $ Y0) ve alt alt (X1, $ Y1) sahip olan bir dikdörtgen çizer. $ col - dikdörtgen rengi

Özdeş görüntüler, ancak elips $ col ile doldurulur

Bu işlevler statik çizgilerin stilini değiştirmenize izin verir. Daha fazla bilgi için, resmi belgelere bakın, özellikle degaSetStySty Fonksiyonunun göstergesi olan ImageSetstyle işlevinin kullanımına dikkat edin.

Resimde $ im koordinatlarla bir nokta ($ x, $ y) ve $ col

Çeşitli işlevler tarafından oluşturulan çizgilerin kalınlığını değiştirir.

Bir resimde, $ im Koordinatlar (sol üst köşe) ($ x, $ y) $ col $ polis renkleri ($ X, $ Y) (Headset) Yazı tipi (0 ila 5)

Aynı hayalperest, ancak dize dikey olarak görüntülenir

İii) Örnek ilk: Site ziyaret istatistiklerini bir grafik şeklinde

Uygulamada kazanılan bilgiyi uygulamak için - Basit bir komut dosyası örneği oluşturun. Genellikle saha ziyaretlerinin bir histogram formundaki istatistiklerini sunmak gerekir.

Ziyaretçilerin muhasebesinden sorumlu olan komut dosyasının bir bölümünü zaten geliştirdiğinizi varsayıyoruz (MySQL tablosunu kullanarak). Buradaki uygulaması hakkında konuşmayacağız, bu bu makalenin amacı değil. Her ay için ziyaret istatistiklerinin bir dizi ziyarette bulunduğunu varsayalım. Bu yazıda, diziyi "manuel olarak" doldururuz, ancak MySQL tablosunuzun verilerini kullanarak kendiniz yapabilirsiniz.

a) Ziyaret istatistikleri: Görüntü ve renk oluşturma

Site ziyaretlerinin istatistiklerini 12 ay boyunca (12 element) içeren bir dizinin oluşturulmasıyla başlayalım. O zaman 400x300 çözünürlüğe sahip bir resim oluşturacağız ve biri (beyaz) arka planın rengi olacak üç renk oluşturacağız.

ziyaret.php.

$ Ziyaretler \u003d dizi (138, 254, 381, 652, 896, 720, 140, 556, 663, 331, 407, 763, 331, 407, 768);

Başlık ("içerik türü: görüntü / png");
$ likituriMage \u003d 400;
$ hauteurimage \u003d 300;
$ im \u003d ImageCreate ($ likiturimage, $ hauteurimage)
YADA ÖL ( "Bir görüntü oluştururken hata");

$ noir \u003d imagecoloralocate ($ IM, 0, 0, 0);
$ Bleu \u003d ImageColorAlocate ($ IM, 0, 0, 255);
?>

b) Grafiğin eksenini çizin

Alanı 10 piksel olarak bırakarak, zamanın yatay eksenini (basit siyah çizgi) görüntünün alt kısmına yerleştirin.

Alt kısımda, döngü ve gelişme işlevi için 12 ayın her birinin sayısını imzalıyoruz. Görüntünün sol tarafında başlayarak, her 30 pikselde numaralar bulunur.

Son olarak, dikey çizgiyi, ziyaretlerin emniyet istatistiklerinin eksenini harcıyoruz.

// yatay bir çizgi tutun, abscissa ekseni (zaman)
ImageLine ($ IM, 10, $ HAUTEURIMAGAGE-10, $ BÜYÜKÜRİMAJ-10, $ HAUTEURIMAGE-10, $ NOIR);
// 12 ayın her birinin sekans numarasını geri çekin
($ MOIS \u003d 1; $ MOIS DANISESTRING ($ IM, 0, $ MOIS * 30, $ HAUTEURIAImage-10, $ Mois, $ Noir);
}

// Koridorun eksenine dikey bir çizgi yaptık (ziyaret sayısı)
ImageLine ($ IM, 10, 10, 10, $ Hauteuriage-10, $ Noir);
?>

c) çubuk çizmek

Şimdi daha karmaşık bir göreve gidin - Çizim çubukları.

İlk olarak, programda bulunacağımız maksimum ziyaretçi sayısını bulmamız gerekiyor. Burada rastgele bir değer seçtik - 1000, ancak aslında, MySQL tablosunuzun sütununun maksimum değeri için bir istek yerine getirerek hesaplamak zorunda kalacaksınız. Bunu kolaylaştıracağız ...

Her ay için, oluşturulan dikdörtgenin yüksekliğini hesaplamak gerekir. Bunu yapmak için, denklemi çözmek, dikdörtgenin yüksekliğinin (çubukların) maksimum ziyaret sayısı için yüksekliğinin tüm görüntünün yüksekliğine eşit olacağını bilerek gereklidir. Belli bir ay için ziyaret sayısına göre, istediğiniz yüksekliği alırız

Yalnızca sol üst köşesinin koordinatları ile başlayan ve alt sağdan biten her dikdörtgeni çizmek için kalır.

Histogramı iyileştirmek için her dikdörtgenin üzerinde bir ay boyunca ziyaret sayısını ekleyin.

// maksimum ziyaretler
$ visitesmax \u003d 1000;

// bir çubuk çiz
için ($ mois \u003d 1; $ mois<= 12 ; $mois ++) {
$ Hauteurimagerectangle \u003d round (($ ziyaretler [$ Mois - 1] * $ hauteurimage) / $ visitesmax);
ImageFilleFlectangle ($ im, $ Mois * 30 - 7, $ HauteurImage - $ hauteurimagerectangle, $ Mois * 30 + 7, $ HauteurImage - 10, $ Bleu);
Hayalperest ($ IM, 0, $ MOIS * 30 - 7, $ HauteurImage - $ hauteurimagerectangle - 10, $ Ziyaretçiler [$ Mois - 1], $ noir);
}

// bu kadar
İmagePng ($ im);
?>

d) Ve işte sonuç!

Sonuç, elbette, mükemmel çağırmayın, ancak kendi başına fena olmayan basit bir kod yazarak sadece 20 satırlık basit bir kod yazarak daha fazla veya daha az sunulabilir bir şey yapmayı aklımızda bulunmamız gerektiğini unutmayın.

12 ay boyunca katılımın histogramı.


İv) Diğer faydalı özellikler

İşte, renk paletini yönetmek için tasarlanmış bir başka yararlı özellikler ve farklı görüntü bilgileri edinmek için tasarlanmıştır.

Açıklama

"Bu özellik, $ Fichier dosyasının adını bir parametre olarak kullanır ve 4 eleman içeren bir dizi döndürür: (1) $ Tableau Görüntü Genişliği (PX), (2) $ Tablo Resim (PX), (3) $ Tableau Image Tipi (CM. Belgeler), (4) $ Tableau, IMG etiketine (Width \u003d "" "1024" "yükseklik \u003d" "768" "" "" "" 768 "" "" "" "768" ""

$ IM'nin bir görüntü alanı olan $ Col renginin saydam olduğu. Saydamlığı kaydetmek için PNG formatını kullanın

DST_IM resmin üzerine $ SRC_IM $ SRC_IM'i kopyalayın. Kopyalama alanı, sol açının ($ SRC_X, $ SRC_Y), $ SRC_L genişliği ve $ SRC_H \u200b\u200byüksekliği olan noktanın koordinatları ile sınırlıdır. Kopyalanan alan, alıcı görüntüsünde koordinatlarla birlikte belirir. ($ Dst_x, $ dst_y)

Aynı ImageGopy, buna ek olarak, fonksiyon, 1 ila 100 arasında değerler alan $ yoğunluk yoğunluğunun tonlarının kademeli olarak geçişini gerçekleştirir.

Aynı etkiyi ImageCopy olarak gerçekleştirir ve ayrıca görüntü boyutunda bir değişiklik yapar. Aşağıdaki örneğe bakın

Aynı ImageCopyResampled, ancak ölçeklendirme sonucu daha az egemendir, ancak fonksiyon daha hızlı çalışır.

JPEG $ Fichier Format dosyasında bulunan görüntüyü belirten kaynak tanımlayıcısını, $ IM'yi döndürür.

PNG $ Fichier PNG formatında bulunan bir görüntüyü belirten kaynak tanımlayıcısını, $ IM'yi döndürür.

Resmin genişliğini döndürür $ IM

$ İm yüksekliğini döndürür

V) Örnek İkincisi: Minyatür Nesil (Azaltılmış Kopyalama Görüntüleri)

Bu örnek, mevcut bir görüntünün azaltılmış bir kopyasını oluşturması amaçlanmıştır. Fotoğrafların minyatür şeklinde sunulduğu PNP'de bir fotoğraf galerisi yazarken bu özelliği uygulamanız gerekebilir ve ziyaretçi büyütmek için fareyle tıklayabilir. Bu örnekte, bir çerçeve ve bazı açıklamalarla donatılmış bir minyatür oluşturacağız (boyut ve resim adı)

başlangıç

İlk örneğin aksine, bu komut dosyası bir resmi bir dosyaya kaydeder ve anında oluşturmaz. Bu nedenle, başlık () işlevini kullanarak özel bir HTTP başlığı gönderme gereği kaybolur. Böylece, komut dosyası "Klasik" olur ve HTML oluşturabilir.

200x150 boyutunda boş bir tuval oluşturulmasıyla başlayalım, ardından ImageCreatefromJPEG işlevini kullanarak mevcut görüntüyü (dosyadan) düşünün. O zaman kaynak görüntünün boyutuna da ihtiyacımız olabilir, bunun için Imagesx ve görüntüleri kullanacağız.

minyatür.php.

$ fichierce \u003d "photo3.jpg";

$ Genişletme \u003d 200;
$ hauteurdestination \u003d 150;
$ im \u003d ImageReaceColor ($ BÜYÜKÜRDINTININTINTING, $ HAUTEURDINTININTINING)
YADA ÖL ( "Bir görüntü oluştururken hata");

$ Kaynak \u003d imageecreatefromjpeg ($ fichierce);

$ likitursource \u003d Imagesx ($ kaynak);
$ hauteursource \u003d Izon ($ kaynak);
?>

b) Çerçeve

Birkaç renk oluşturduktan sonra çerçeveyi çizin. Görevi basitleştirmek için, çeşitli gri tonlarını kullanacağız.

Bir diğerine gömülü birkaç çok renkli dikdörtgen çizgisinde yatan benzer bir çerçeve oluşturmanın basit bir yolu var. Karanlık rengin en büyük dikdörtgeninden başlıyoruz (boyutu görüntünün boyutuyla çakışıyor). Ardından, rengi daha hafif, vb. Beden, daha küçük bir dikdörtgen uyguladık.

ABD tarafından oluşturulan çerçevenin kalınlığı 8 pikseldir.

$ Blanc \u003d ImageColorAlocate ($ IM, 255, 255, 255);
$ Gris [0] \u003d ImageColorAlocate ($ IM, 90, 90, 90);
$ Gris [1] \u003d ImageColorAlocate ($ IM, 110, 110, 110);
$ Gris [2] \u003d ImageColorAlocate ($ IM, 130, 130, 130);
$ Gris [3] \u003d ImageColorAlocate ($ IM, 150, 150, 150);
$ Gris [4] \u003d ImageColorAlocate ($ IM, 170, 170, 170);
$ Gris [5] \u003d ImageColorAlocate ($ IM, 190, 190, 190);
$ Gris [6] \u003d ImageColorAlocate ($ IM, 210, 210, 210);
$ Gris [7] \u003d ImageColorAlocate ($ IM, 230, 230, 230);

İçin ($ i \u003d 0; $ i<= 7 ; $i ++) {
İmageFilleFlectangle ($ im, $ i, $ i, $ ırksalDestinasyon - $ i, $ hauteurdestination - $ i, $ gris [$ i]);
}
?>

c) minyatürler oluşturmak

Küçük resimlerin oluşturulması için, ImageCopyResampled özelliği kullanılır. Bir görüntüyü diğerine kopyalar, kopyalanan alanın boyutunu değiştirebilir. Bu fonksiyon, değeri açık olan birkaç parametre alır. Onları sırayla listeliyoruz:

  • ($ im) resim alıcısı
  • ($ Kaynak) image kaynak
  • Resmin altına alındığı alıcı görüntünün görüntüsünün koordinatı.
  • Koordinat Y.
  • Koordinat x kopya kaynak görüntü alanı (0 Resmi kopyalamak istiyorsak)
  • Koordinat (Y)
  • Kaynak görüntünün içine yerleştirilmiş kopyanın genişliği ($ BÜYÜKDESTINATING- (2 * 8) alıcı görüntünün genişliği sağa ve soldaki çerçeve genişliğini eksi).
  • Kopyalama yüksekliği (aynı işlemleri genişlikte olduğu gibi yapıyoruz)
  • Kopya kaynağı görüntü alanı genişliği
  • , $ hauteursource);
    ($ IM, 0, 12, $ HauteurDinTination - 18, "$ Fichierce - ($ Fichierce - $ Fichierce)", $ Blanc);
    ?>

    d) Sonucu tasarruf edin.

    Sadece sonucu, adı Mini_ ile başlayan dosyada kaydedebiliriz. Bu ImageJPEG işleviyle yapacağız.
    Bu özellik yalnızca bir parametreye sahip olduğunda, görüntü kullanıcının tarayıcısında görüntülenir. Bununla birlikte, dosya adı ikinci parametre olarak iletilirse, tarayıcıya gelmez ve resim belirtilen dosyaya kaydedilecektir. Aynı kural, imagepng işlevi için geçerlidir.

    Resmim görüntülenmiyor, tarayıcı yokmuş gibi davranır.
    Büyük olasılıkla, hata komut dosyanızda imzalanmalıdır. Header String'den ("İçerik Türü: Görüntü / PNG") (veya Başlık ("İçerik Türü: Resim / JPEG")), ImagePng String ($ IM) (ORIMAGEJPEG ($ IM) )) bir hata mesajı almak için

    Script bizim barındırma için uzun sürüyor, normal mi?
    ImageCopyResampled olarak "ağır" işlevleri kullanıyorsanız, şaşırtıcı değildir. PHP tercümanı, barındırma üzerine kuruludur ve bu çalışma olmadan yeterli ...

    Resmimin renkleri bozuk (veya siyah ve beyaz olarak görüntülenir), neden?
    Büyük olasılıkla 256 renge renk paletini sınırlayan ImageRreate özelliğini kullandınız. Bu kısıtlamanın üstesinden gelmek için, ImageCreate yerine ImageCreatetUsolor işlevini kullanın.

    Bu makaleyi bitirmek, bu makalenin iki örneğini birleştirerek elde edilebilecek sonucu gösteriyoruz. Burada, Örnek 2'deki gibi aynı yöntemi kullanarak histograma yarı ton ekledik.

    Sonuç


Bu yazıda, üçüncü taraf bileşenlere ve çerçevelere başvurmadan php kullanarak sunucuya görüntü yükleme mekanizmasını ayrıntılı olarak açıklayacağız. Görüntüleri yalnızca yerel kullanıcı makinesinden değil, aynı zamanda uzak dosyaları referans olarak güvenle yüklemeyi öğreneceğiz. Kodun tüm örnekleri, kodu daha hızlı okumak ve bir yöntemden diğerine atlamak için prosedürel bir tarzda yazacağım. Manuel tam telif hakkı ve sunumun herhangi bir akademağını talep etmiyor.

§bir. Genel İlkeler

Sunucuya yükleme dizisinin tamamı aşağıdaki gibi görüntülenebilir: php.ini kurmakdosya Almagüvenlik kontrolüveri doğrulamadiskte Tasarruf. Bir resim bilgisayardan veya URL'lerden bir resim yükleme işlemi, bir görüntü ve tasarruf sağlama yöntemi dışında, farklı değildir. Sunucudaki resmin genel yükleme şeması aşağıdaki gibidir:

Resmi URL'deki doğrulamak için, GetImagesizefromString () işlevini kullanacağız, çünkü curl daha fazla manipülasyon için bir değişkene indirir.

Sunucuya görüntüler yüklerken, belirli parametrelerini kontrol etmek iyi olur: genişlik, yükseklik, bir tür Resimler, boyut bayt olarak dosya. Uygulamanızın mantığına bağlıdır, ancak bu kılavuzdaki netlik için, yukarıda açıklanan tüm parametreleri kontrol edeceğiz.

§2. Güvenlik Düzenlemeleri

Yabancı kodun sunucuya ve yürütülmesini önlemek için görüntü yüklemesinin güvenliği azalır. Uygulamada, PHP uygulamalarındaki en savunmasız yeri resim yükleme: kabuk komut dosyası, İkili dosyalarda kötü amaçlı bir kod olacak, eXIF verilerini imzalama. Hackleme yöntemlerinin çoğunu önlemek için aşağıdaki kuralları takip etmeniz gerekir:

fakat değil $ _ dosyalardan gelen verilere güven;
b. değil GetImagesize () işlevinden MIME resim türünü kontrol edin;
İndirilebilir dosyada, yeni bir isim ve genişleme oluşturun;
g PHP komut dosyalarının resim klasöründeki yürütülmesini yasaklamak;
d. değil Kullanıcı verilerini gerektirir ve dahil edin;
e $ _FILES için IS_UPLOADED_FILE () ve MOVE_UPLOADED_FILE () kullanın.

"Güvenlik Kuralları" ekleyecek bir şey varsa, yorumlarınızı veya referanslarınızı bu rehber için yorumlarda güvenlik makalelerine bırakın ve bu paragrafta yayınlarım.

§3. Php.ini yapılandırması

PHP, herhangi bir dosyayı indirme işleminde belirli yapılandırma değerleri yapmanızı sağlar. Bunu yapmak için, php.ini dosyasında blok bulmak için gereklidir " Kaynak sınırları.», « Veri işleme"Ve" Dosya yüklemeleri."Ve ardından gerekirse, aşağıdaki değerler:

; Script'in maksimum yürütme süresi saniyeler içinde max_execution_time \u003d 60. ; Tek komut dosyası ile maksimum bellek tüketimi Memory_limit \u003d 64m. ; Post yöntemi tarafından gönderilen verilerin izin verilen maksimum boyutu post_max_size \u003d 5m. ; Dosyaları indirmek için izin File_uploads \u003d Açık. ; Dosyaları indirmek için depolamak için klasör Upload_tmp_dir \u003d Ana Sayfa / Kullanıcı / Sıcaklık ; İndirilen dosyanın maksimum boyutu Upload_max_filesize \u003d 5m. ; İzin verilen maksimum aynı anda indirilebilir dosya sayısı Max_file_uploads \u003d 10.

Belirtilen değerlere göre, kullanıcı bir kerede ondan fazla dosya yükleyemeyecek ve her dosya 5 MB'yi geçmemelidir. Bloktan parametreler " Kaynak sınırları.»Uzak bir dosyayı indirmek için daha gerektiğinden, çünkü curl ile içeriği değişkene indireceğiz ve ihtiyacımız olan kriterleri kontrol edeceğiz ve bunun için fazladan zamana ve belleğe ihtiyacınız var.

PHP.ini yapılandırma dosyasının her zaman geliştirilen Web uygulamasının iş mantığına göre yapılandırmak için gereklidir. Örneğin, 5 MB'a kadar en fazla on dosyayı yüklemeyi planlıyoruz; bu, ~ 50 MB hafızaya ihtiyaç duymamız gerektiği anlamına gelir. Ek olarak, bir dosyanın bir dosyasının maksimum yükleme süresini yerel makineden ve betiğin maksimum bir yürütme süresi ayarlamak için MAX_EXECUTITY_TIME'sinde ve kullanıcıların hatalarını korkutmadığı için bilmemiz gerekir.

§Four. Formdan resim yükleme

Şimdi sunucuya birden fazla dosyanın indirilmesini düşünmeyeceğiz ve yalnızca bir dosya örneğinde indirme mekaniğini analiz edeceğiz. Bu nedenle, bir bilgisayar bilgisayarından bir resim yüklemek için, POST yöntemini kullanarak PHP komut dosyası dosyasını göndermek için HTML formunu kullanmanız ve veri kodlama yöntemini belirtmeniz gerekir. enctype \u003d "Multipart / Form-Data" (Bu durumda, veriler kodlanmış değildir ve bu değer yalnızca ikili dosyaları göndermek için uygulanır). Aşağıdaki formda daha fazla çalışacağız:

Dosya seçimi alanı için ismi kullanıyoruz. İsim \u003d "Yükle" HTML formumuzda, olsa da olsa da. PHP Script Dosya-Handler.php dosyasını gönderdikten sonra, bir süperglobal değişken kullanılarak ele geçirilebilir. $ _Files ["Yükle"] Dizide dosya bilgisi içerdiği aynı adla:

Dizi ( \u003d\u003e Picture.jpg. // Orijinal Dosya Adı \u003d\u003e Görüntü / JPEG // MIME Dosya Türü \u003d\u003e Ana Sayfa \\ Kullanıcı \\ Temp \\ phpd07e.tmp // İkili Dosya \u003d\u003e 0 // hata kodu => 17170 // bayt cinsinden dosya boyutu)

Tüm veri değil $ _Files. Güvenebilirsin: MIME-Tip ve Dosya Boyutu, bir HTTP yanıtından oluştukları için yapılabilir ve dosya adındaki uzantı, tamamen farklı bir dosyanın gizlenebileceği nedeniyle güvenilmemelidir. Bununla birlikte, ayrıca dosyamızın doğru yüklenip yüklendiğini ve hiç önyüklenip önyüklenip önyüklenmeyeceğini kontrol etmemiz gerekir. Bunu yapmak için, hataları kontrol edin. $ _Files ["yükle"] ["Hata"] Ve fonksiyonu kullanarak dosyanın posta tarafından yüklendiğinden emin olun. is_uploaded_file (). Bir şey planda değilse, ekrandaki hatayı almamız anlamına gelir.

// Rahatlık için değişkenleri yeniden şekillendirin $ filepath \u003d $ _Files ["upload"] ["tmp_name"]; $ ERRORCODE \u003d $ _FILES ["UPLOAD"] ["HATA"]; // Hataları kontrol et if ($ errorcode! \u003d\u003d upload_err_ok ||! is_uploaded_file ($ filepath)) ( // hata isimleri ile dizisi $ errormessages \u003d [upload_err_ini_size \u003d\u003e "Dosya boyutu, PHP yapılandırmasındaki Update_max_FileSize değerini aştı.", Upload_err_form_size \u003d\u003e "İndirilen dosyanın boyutu, MAX_FILE_SIZE değerini HTML formunda aştı.", Upload_err_partial \u003d\u003e "İndirme dosyası sadece kısmen elde edildi.", Upload_err_no_file \u003d\u003e "Dosya yüklenmedi.", Upload_err_no_tmp_dir \u003d\u003e "Geçici bir klasör yok.", Upload_err_cant_write \u003d\u003e "Bir dosyayı diske kaydedemedi.", Upload_err_extension \u003d\u003e "PHP uzantısı bir dosyayı indirmeyi bıraktı.", ]; // bilinmeyen hatayı ayarla $ UnknownMessage \u003d. "Dosyayı indirirken bilinmeyen bir hata oluştu."; // dizideki hata kodu yoksa, bir hatanın bilinmediğini söyleyelim. $ OutputMessage \u003d ISSET ($ Errormessages [$ ErrorCode])? $ Errormessages [$ ErrorCode]: $ BilinmeyenMessage; // Hatanın adını geri çek Ölmek ($ çıkışmessage); )

Saldırganın görüntüye yerleştirilen kötü amaçlı kodu yüklememesi için, işlevlere güvenemezsiniz. getImagesize ()aynı zamanda MIME türünü de döndürür. İşlev, doğru görüntü dosyasına atıfta bulunma ilk argümanının. FileInfo uzantısından gerçek bir MIME türünü tanımlayabilirsiniz. Aşağıdaki kod, anahtar kelimenin varlığını kontrol eder görüntü. İndirilebilir dosyamızın türünde ve çıkmazsa, bir hata verir:

// Bir kaynak oluşturma FileInfo $ fi \u003d finfo_open (fileinfo_mime_type); // Mime Tip $ MIME \u003d (string) finfo_file ($ fi, $ filepath); );

Bu aşamada, MIME türünü kontrol eden sunucumuzda kesinlikle herhangi bir resmi yükleyebiliriz, ancak görüntüleri belirli özelliklere göre yüklemek için, işlevleri kullanarak onları doğrulamamız gerekiyor. getImagesize ()hangi ikili bir dosya olabilir $ _Files ["yükle"] ["tmp_name"]. Sonuç olarak, 7 element dizisi elde ediyoruz:

Dizi (\u003d\u003e 1280 // width \u003d\u003e 768 // yükseklik \u003d\u003e 2 // Type \u003d\u003e width \u003d "1280" yükseklik \u003d "768" // HTML için nitelikler \u003d\u003e 8 // renk derinliği => 3 // renk modeli \u003d\u003e Görüntü / JPEG // MIME tipi)

Görüntünün daha fazla doğrulanması için ve üzerinde çalışın, sadece 3 değer bilmemiz gerekir: genişlik, yükseklik ve boyut Dosya (boyutu uygun işlevi hesaplamak için dosya boyutu () Geçici bir klasörden ikili bir dosya için).

// sonuç fonksiyonu değişkende yaz $ Image \u003d getImagesize ($ filepath); $ Limitbytes \u003d 1024 * 1024 * 5; $ limit genişliği \u003d 1280; $ limitheight \u003d 768; // İstediğiniz parametreleri kontrol edin Eğer (DosyaO ($ filepath)\u003e $ limitbytes) ölürse "Görüntü boyutu 5 MB'ı geçmemelidir."); if ($ Image\u003e $ limitheight) ölürse () ölür (); eğer ($ Image\u003e $ limit genişliği) ölürse () ölür ();

Tüm çeklerden sonra, indirilebilir dosyamızı bazı resimler klasörüne taşımak için güvenle yapabiliriz. Fonksiyon boyunca daha iyi yapın move_uploaded_file ()hangi güvenli modda çalışır. Dosyayı hareket ettirmeden önce, unutamazsın görüntü türünden rastgele bir isim ve genişleme oluşturun Dosyamız için. Bu gibi görünüyor:

// MD5-Hash'e göre yeni bir dosya adı oluşturun $ İsim \u003d md5_file ($ filepath); // .jpg'den önce SOCIL .JPEG.// Resmi yeni bir isim ve uzantıyla klasöre / resimlere taşıyın if (! Move_uploaded_file ($ FilePath, __dir__ "." / Pics / ". $ İsim. $ Biçimlendirme)) (Die ( "Bir görüntü yazarken bir hata oluştu."); }

Bu bunda tamamlandı. Dosyaların daha rahat indirilmesi için, UploadedFile sınıfını Symfony HttpFoundation paketinden, bir sarmalayıcı olan Symfony HttpFoundation paketinden kullanabilirsiniz. $ _Files. ve ayrıca dosyayı aracılığıyla kaydeder move_uploaded_file ().

§beş. Resmi referans olarak yükleme

Resmi referans olarak indirmek için, uzak kaynaklarla çalışan bir kıvrılma kütüphanesine ihtiyacımız var. Bununla birlikte, değişkende içerik indireceğiz. Bir yandan, bu amaçlar için olacağı gibi görünebilir. file_get_contents ()Ancak aslında indirilebilir verilerin hacmini kontrol edemeyiz ve normalde tüm hataları işler. Curl için ihtiyacımız olan verileri doğru indirdi: Takip etmesine izin ver yönlendirmekKontrolleri etkinleştir sertifikaNokta maksimum süre Curl çalışır (indirilebilir verilerin hacmi ve bir kaynağa sahip ortalama hızı nedeniyle oluşur). Dosyayı gerekli parametrelerle aşağıda gösterilen değişkene nasıl indirilir:

// bir şekilde bir bağlantı alıyoruz $ url \u003d "https://site.ru/picture.jpg"; // link adresinde HTTP'yi kontrol edin Eğer (! preg_match ("/ ^ https?: / i", $ URL) && filter_var ($ url, filter_validate_url)) (Die ( "Uzak dosyaya doğru bağlantıyı belirtin."); } // referansımızla kıvrılmayı başlat $ ch \u003d curl_init ($ url); // kıvrılma ayarlarını belirtin Curl_setopt_array ($ ch, [ // Curl'un maksimum çalışma saatlerini belirtin Curlopt_timeout \u003d\u003e 60, // Yönlendirmeleri takip etmesine izin ver Curlopt_followlocation \u003d\u003e 1, // sonucun değişkende yazmasına izin ver Curlopt_returnTransfer \u003d\u003e 1, // veri yükü göstergesini açın Curlopt_noprogress \u003d\u003e 0, // arabellek boyutunu 1 kb boyayın Curlopt_Buffersize \u003d\u003e 1024, // İndirilen verileri saymak için bir özellik yazın // Devamını oku: http://stackoverflow.com/a/17642638 Curlopt_ProgSessFunction \u003d\u003e İşlev ($ CH, $ DWNLDSize, $ DWNLD, $ GRUPDIZE, $ UPDD) ( // 5 MB'den fazla indirildiğinde, curl işi kesecek Eğer ($ DWNLD\u003e 1024 * 1024 * 5) (dönüş - 1;)), // sertifika kontrolünü açın (varsayılan olarak) Curlopt_ssl_verifypeer \u003d\u003e 1, // Belginin adını ve belirtilen ana bilgisayarla tesadüfini kontrol edin (varsayılan olarak) Curlopt_ssl_verifyhost \u003d\u003e 2, // doğrulama sertifikasını belirtin // İndir: https://curl.haxx.se/docs/caextract.html Curlopt_cainfo \u003d\u003e __dir__. "/Cacert.pem",]); $ RAW \u003d Curl_exec ($ ch); // Verileri değişkene indirin $ info \u003d curl_getinfo ($ ch); // operasyon hakkında bilgi alıyoruz $ hata \u003d curl_errno ($ ch); // Son hatanın kodunu yaz // kıvırmak kıvırmak oturumu Curl_close ($ ch);

Her şey başarılı bir şekilde geçerse ve kıvrılma 60 saniye içinde bir araya geldi, daha sonra bağlantıdaki içerikler değişkene indirilecektir. $ RAW.. Ek olarak, fonksiyon curl_getinfo () İstenen istek hakkında bilgi verin, uzak kaynaklarla çalışmayı analiz etmek için daha fazla bilgi edinebiliriz:

Dizi ( \u003d\u003e Görüntü / JPEG // MIME-Content-Tipten Tip => 200 // Son HTTP Kodu => 0 // Yönlendirme Sayısı => 0.656 // Toplam kıvır zaman => 0.188 // Host ile bağlantı kurma zamanı => 4504 // verilerin gerçek boyutu => 4504 // içerik uzunluğundan veri boyutu /* ... */ )

Daha sonra, hata olup olmadığını kontrol etmemiz gerekir. curl_errno () Ve kaynağın HTTP kodunu 200'e eşit verdiğinden emin olun, aksi takdirde böyle bir URL için bulunamadığını söyleyeceğiz. Tüm kontroller değişkeninden sonra $ RAW. Transfer B. getimagestring () Ve resimlerin formdan yüklenmesi durumunda, egzoz şemasında zaten çalışıyoruz.

Curl_getinfo () 'nin güvenini aldığımız zaman, dosyanın boyutunu kazandığımızdan, Control_Type, HTTP_CODE değerleri, Download_Content_length, alınan HTTP başlıklarına göre oluşturulduğundan lütfen unutmayın. Dosyayı tamamen indirin ve ardından bayt sayısını çok fazla zaman ve bellek gerektirecektir. Bu nedenle, Curlopt_progSessFunction seçeneğini kullanarak elde edilen verilerin boyutunu kontrol ettik: Curl sınırımızdan daha fazla veri almaz, çalışmayı durdurur ve Curle_aborTed_by_callback hatasını verecektir.

// kıvırmak hatalarını ve dosyanın kullanılabilirliğini kontrol edin if ($ hata \u003d\u003d\u003d curle_operation_timedout) ölmek ( "Beklenti sınırı aşıldı."); Eğer ($ hata \u003d\u003d\u003d curle_aborted_by_callback) ölürse ( "Boyut 5 MB'yi geçmemelidir."); İf ($ bilgi ["http_code"]! \u003d\u003d 200) ölmek ( "Dosya mevcut değil."); // Bir kaynak oluşturma FileInfo $ fi \u003d finfo_open (fileinfo_mime_type); // $ RAW içeriğini kullanarak MIME-Tipi Al $ Mime \u003d (string) finfo_buffer ($ fi, $ raw); // Kaynak FileInfo'yu kapatın Finfo_close ($ fi); // Anahtar kelime görüntüsünü kontrol edin (görüntü / JPEG, Image / PNG, vb.) Eğer (Strps ($ MIME, "image") \u003d\u003d\u003d yanlış) ölürse "Sadece görüntüleri indirebilirsiniz."); // görüntü verilerini içeriğinden alın. $ Image \u003d getImagesizefromstring ($ raw); // Resimler için kısıtlamaları ayarlayın $ limit genişliği \u003d 1280; $ limitheight \u003d 768; // İstediğiniz parametreleri kontrol edin if ($ Image\u003e $ limitheight) ölürse "Görüntünün yüksekliği 768 puanı geçmemelidir."); if ($ Image\u003e $ limitli) ölürse ( "Görüntü genişliği 1280 puanı geçmemelidir."); // MD5-karma görüntüsünden yeni bir isim oluştur $ İsim \u003d MD5 ($ RAW); // görüntü türüne göre dosya uzantısı oluşturma $ uzantısı \u003d image_type_to_extension ($ resim); // .jpg'den önce SOCIL .JPEG. $ Format \u003d Str_Replace ("JPEG", "JPG", $ uzantısı); // Resmi yeni bir isim ve uzantıyla klasöre / resimlere kaydet if (! file_put_contents (__dir__. "/ pics /". $ İsim. $ Biçim, $ RAW)) (Die ( "Bir görüntü kaydedilirken bir hata oluştu."); }

Kaydetmek için resmi kullanabilirsiniz. file_put_contents ()hangi içeriği dosyaya kaydeder. İşlev aracılığıyla oluşturacağımız yeni dosya adı md5 ()ve uzatma yapacak image_type_to_extension (). Şimdi bağlantıya herhangi bir resim yükleyebiliriz.

§6. Birden fazla dosya seçimi kurma

Bu bölümde, birden fazla görüntü indirme yöntemlerini yerel kullanıcı makinesinden ve uzaktaki bağlantılardan analiz edeceğiz. Bağlantıları göndermek için bağlantılar kullanıyoruz $ _POST. ve etiketi kullanarak tüm verileri verelim. textarea.. Formdan dosyaları indirmek için çalışmaya devam edeceğiz $ _Files.. Yeni HTML formumuz eskisinden biraz farklı olacaktır.

Dosya seçim alanı adının sonunda İsim \u003d "Yükle" Figürlü diş telleri ve öznitelik eklendi ÇokluBu, tarayıcının birden fazla dosya seçmesini sağlar. Php.ini'de hata yoksa, tüm dosyalar geçici bir klasörde tekrar indirilir. Onları engelleyebilirsiniz $ _Files.Ancak bu kez, SuperGlice değişkeni, dizideki veri işleme için rahatsız edici bir yapıya sahip olacaktır. Bu görev bir dizi ile küçük manipülasyonlarla çözülür:

// $ _Files yapısını değiştir Foreach ($ _Files ["yükle"] olarak $ Key \u003d\u003e $ değeri olarak (foreach ($ değeri $ K \u003d\u003e $ v) ($ _Files ["yükle"] [$ k] [$ tuş] \u003d $ v; ) // Eski tuşları kaldır Unsem ($ _Files ["yükle"] [$ tuş]); ) // tüm resimleri sırayla yükle Foreach ($ _Files ["yükle"] olarak $ k \u003d\u003e $ v) ( // bir dosyayı yükle $ _Files ["yükle"] [$ k] ["tmp_name"]; $ _Files ["yükle"] [$ k] ["hata"]; )

URL'de birkaç resim indirmek için, bağlantılarımızı aracılığıyla verelim. textarea. İsimle İsim \u003d "Yükle"bir boşlukla veya yeni bir satırdan belirtilebilirler. İşlev preg_split. Felaket tüm verileri $ _POST ["yükle"] Ve döngüye yürümek için ihtiyacınız olan ve her geçerli URL'nin işleyiciye göndermesi gereken bir dizi oluşturur.

$ veri \u003d preg_split ("/ \\ s + /", $ _POST ["yükleme"], - 1, preg_split_no_empty); Foreach ($ url olarak $ veri) ( // Resmi URL'ye doğrulamak ve yüklemek }

Boş bir resim oluşturma.

Sözdizimi:

İnt ImageCreate (int x, int y)

Boş bir resim boyutu oluşturur x. üzerinde y. Noktalar ve tanımlayıcısını döndürür. Resim yaratıldıktan sonra, bu tanımlayıcıdan, bu tanımlayıcıdan, tanımlayıcısı aracılığıyla dosyayla nasıl çalıştığımızla analog olarak gerçekleştirilir.

Misal:

İle yeni bir resim oluşturma Gd. ve tarayıcı ekranına geri çekilmesi:

imagecreatefrompng.

PNG dosyasından bir resim oluşturma.

Sözdizimi:

İnt imageCreatefrompng (dize dosya adı)

Bu işlev, PNG dosyasındaki görüntüleri belleğe yükleyin ve tanımlayıcıya geri döndürür. Aramadan sonra olduğu gibi imageCreate ()

Misal:

Grafik dosyasını açarken bir hata bulmanın bir örneği.

Function Loadpng ($ imgname) ($ imgName) ($ imgname); / * Açma girişimi * / if (! $ IM) (/ * Başarısız olup olmadığını görün * / $ IM \u003d ImageCreate (150, 30); / * Boş bir resim oluşturma * / $ BGC \u003d ImageColorAlocate ($ IM, 255, 255, 255); $ TC \u003d ImageColorAlocate ($ IM, 0, 0, 0); ImageFilleFlectangle ($ IM, 0, 0, 150, 30, $ BGC); / * bir errmsg çıktı * / hayalperestring ($ IM, 1, 5, 5, "$ IMGNAME yükleniyor", $ tc);) $ IM;)

İmagecreatefromjpeg.

JPEG dosyasından bir resim oluşturma.

Sözdizimi:

İnt ImageCreatefromJPEG (dize dosya adı)

imageCreate (), Resimle daha fazla çalışma sadece bu tanımlayıcıdan mümkündür. Bir diskten önyükleme yaparken, görüntü açılmamış ve bellekte önceden paketsiz bir biçimde saklanır, böylece ölçeklendirme, çizim hatları vb. Gibi farklı işlemler yapabilirsiniz.

imagecreatefromgif

GIF dosyasından bir çizim oluşturma.

Sözdizimi:

İnt ImageCreatefromgif (dize dosya adı)

Bu özellik, görüntüleri dosyadan belleğe yükleyin ve tanımlayıcısını iade edin. Aramadan sonra olduğu gibi imageCreate (), Resimle daha fazla çalışma sadece bu tanımlayıcıdan mümkündür. Bir diskten önyükleme yaparken, görüntü açılmamış ve bellekte önceden paketsiz bir biçimde saklanır, böylece ölçeklendirme, çizim hatları vb. Gibi farklı işlemler yapabilirsiniz.

Bahsetmeye değer Gd. 1.6 sürümünden başlayarak GIF formatını desteklemez. Bu bağlamda, bu işlev pratik olarak kullanılmaz.

imagePng.

İşlev, bir görüntüyü PNG formatında herhangi bir tarayıcıya veya bir dosyaya görüntüler.

Sözdizimi:

İnt imgepng (int im [, string dosya adı])

Bu özellik, tanımlayıcısı ve bellekte belirtilen görüntüyü, diske veya tarayıcıya getirir.

imageCreate () bEN..

Eğer argüman varsa dosya adı. İçerik türü. Başlık ().

Başlık ("İçerik Türü: Görüntü / PNG") Png için.

Misal: İşlevi kullanma örneği imagePng ():

Alfa kanalı kaynak görüntüsünü kaydetmek için, işlevi kullanın imagesavealpha ():

İmagejpeg.

Resim JPEG tarayıcısını sıkın veya dosyada kaydedin.

Sözdizimi:

İnt imagejpeg (int im [, dize dosya adı [, int kalite]]

Bu özellik, tanımlayıcısı tarafından belirtilen görüntüyü ve belleğe diske kaydeder veya tarayıcıya görüntüler.

Tabii ki, ilk önce bir görüntü bir işlev kullanılarak yüklenmeli veya oluşturulmalıdır. imageCreate (). Tanımlayıcısını bilmemiz gerekiyor bEN..

Eğer argüman varsa dosya adı. İhmal, ardından uygun biçimde sıkıştırılmış veriler doğrudan standart çıkış akışına, yani görüntülenir. Tarayıcıda. İstenen başlık İçerik türü. Görünüşe göre, manuel olarak kullanmanız gereken şekilde görüntülenmez. Başlık ().

Aslında, görüntünün türüne bağlı olarak üç komuttan birini aramanız gerekir:

Başlık ("İçerik Türü: Görüntü / JPEG") JPEG için

Üçüncü İsteğe Bağlı Parametre kalite. Görüntü kalitesini (0'dan 100'e kadar) ayarlar.

image2wbmp

Görüntüyü bir tarayıcıya veya dosyaya görüntüleme.

Sözdizimi:

İnt image2wbmp (kaynak resmi [, dize dosya adı [, int eşiği]])

İşlev, tanımlayıcı tarafından belirtilen bir görüntüyü görüntüler. görüntü., tarayıcıda veya adı isteğe bağlı bir parametre tarafından ayarlanan bir dosyaya dosya adı..

Görüntü tarayıcıda görüntülenirse, Image / vnd.wap.wbmp özelliği olarak WBMP türünü belirtmelisiniz. Başlık ():

İşlev image2wbmp () Mevcut Php. Sadece kütüphane sürümü ise Gd. 1.8 veya daha düşük.

imagegif.

GIF tarayıcısının bir resmini gönderme veya dosyada kaydetme.

Sözdizimi:

İnt imagegif (int im [, string dosya adı])

İşlev, tanımlayıcısı ve bellekte belirtilen görüntüyü diske kaydedin veya tarayıcıya çıktı.

Tabii ki, ilk önce bir görüntü bir işlev kullanılarak yüklenmeli veya oluşturulmalıdır. imageCreate (). Tanımlayıcısını bilmemiz gerekiyor bEN..

Eğer argüman varsa dosya adı. İhmal, ardından uygun biçimde sıkıştırılmış veriler doğrudan standart çıkış akışına, yani görüntülenir. Tarayıcıda. İstenen başlık İçerik türü. Görünüşe göre, manuel olarak kullanmanız gereken şekilde görüntülenmez. Başlık ().

Aslında, görüntünün türüne bağlı olarak üç komuttan birini aramanız gerekir:

Başlık ("İçerik Türü: Görüntü / GIF")

Çünkü kütüphane Gd.Sürüm 1.6 ile başlayarak, GIF formatını desteklemez, bu işlev nadiren kullanılır.

imageCopy.

Desenin kopyalanması.

Sözdizimi:

Int ImageCopy (int dst_im, int src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)

İşlev, dikdörtgen alanı bakış açısından kopyalar ( src_x., src_y.) Genişlik src_w. ve yükseklik src_h. Çizimden src_im çizimde dST_IM., kopyalanan bir ofset alanı vererek ( dST_X., dst_y.).

Aşağıdaki örnek resim olacak file1.png. Tamamen B tarafından kopyalandı. file2.png.

imageCopyresed

Ölçekleme ile bir model parçasını kopyalamak.

Sözdizimi:

İnt imagecotized (int dst_im, int src_im, int dstx, int dty, int srcx, int srcy, int dstw, int dsth, int srcw, int srch)

Bu özellik en güçlü ve evrensellerden biridir. Kullanımı, görüntüleri (veya bölümlerini) kopyalayabilir, taşıyabilir veya ölçeklendirebilirsiniz.

dST_IM. İşlevin sonucunun yerleştirileceği görüntü tanımlayıcısını belirtir. Bu görüntü zaten oluşturulmalı veya yüklenmeli ve uygun boyutlara sahip olmalıdır.

src_im - Çalışmanın gerçekleştirildiği bir görüntü tanımlayıcısı. Ancak, src_im ve dst_immogut ve çakışır.

Parametreler sRCX., sRCY., srcw., srch Yukarıdaki kaynak görüntünün içindeki alanı, sırasıyla, sol üst köşesinde, genişlik ve yükseklik koordinatları.

Sonunda dört dSTX., dTY., dstw., dsteh Resimdeki yeri belirtir dST_IM.Önceki dörtte belirtilen dikdörtgeni "sıktı" olacak. İki dikdörtgenin genişliği veya yüksekliğinin çakışmadığı durumunda, resim otomatik olarak germek veya sıkıştırmak için tasarlanacaktır.

Aşağıdaki örnekte file1.jpg. iki kez azalır ve dosyaya yazar file2.jp.g:

imagedestroy

Yıkım deseni.

Sözdizimi:

İnt imagedestroy (int im)

İşlev tanımlayıcıyı yok eder bEN. Önceden oluşturulan desen (bir dosyayı kapatmak gibi fclose () Açtıktan sonra fopen ()).

Avid PHP geliştiricisiyseniz, muhtemelen GD Kütüphanesi Grafik Kütüphanesi'ni duydunuz. Buna aşina olmayanlar için, GD kütüphanesinin görüntüler oluşturmanızı, değiştirmenize ve yönetmenize izin verdiğini açıklarım. Bugün, PHP Grafik Kütüphanesi GD Kütüphanesinde AZA kullanımıyla tanışacağız.

Öncelikle

GD kütüphanesinin sunucunuzda yüklü ve etkinleştirildiğinden emin olun. Nasıl yapacağımı bilmiyorum? Endişelenme, her şey basit! Sadece sunucuya bir PHP dosyası oluşturmanız, ardından aşağıdakileri girmeniz gerekir:

Şimdi tarayıcı sayfasını açın ve PHP sürümünüzün büyük bir listesini göreceksiniz. Biraz aşağı kaydırın, 'GD' bölümünü bulun ve kütüphanenin bağlı olduğundan emin olun. Değilse, barındırma hizmeti barındıran şirketle iletişim kurun. Neyse ki, çalışmayı ve çalışmayı başardığım çoğu sunucuda, GD kütüphanesi kurulur ve bağlanır.

Vurgulamak

Bazı büyük anlardan geçelim. İlk olarak, tüm hata raporlarının tarayıcı tarafından verilmesi için yapacağız. Bu, PHP kodunuzun başında aşağıdakilere girerek elde edilebilir:

Error_reporting (e_all);
?>

Bir kare çiz

En basitiyle başlayalım ve PHP'nin Mavi Meydanın Yardımı ile başlayalım - doğaüstü bir şey değil, elbette hiçbir şey değil, ancak temel bilgilerle uğraşmak gerekir. İstenilen kareyi almak için aşağıdaki işlemleri yapmanız gerekir:

İçerik türünü "görüntü" olarak ayarlayın, böylece tarayıcı görüntüyü düzgün şekilde yorumlayabilir;
. İstenilen genişlik ve yüksekliği ayarlayarak yeni bir boş görüntü oluşturun;
. Renk arka plan mavi yapmak;
. Son görüntü seçeneğini kaydedin ve tarayıcıya aktarın;
. Görüntüyü oluşturmak ve depolamak için kullanılan açık bellek;
. Index.php dosyasından görüntü ekranı düzenleyin

Şimdi eylem prosedürüne karar verdik, kodlamayı başlatabilirsiniz. Kodun her satırında ve kodlama işleminde kullanılan işlevler hakkında yorum yapmaya çalıştım, sonra sonra konuşacağım. Yani, Mavi Meydanımızı oluşturmanın kodu. Yazdıktan sonra, 'temel_square.php' adına göre tasarruf edeceğiz.

// Hata mesajlarının ekranını takın
ini_set ("Display_Errors", "1");
Error_reporting (e_all);


// görüntü boyutlarını belirleme
// 125px genişlik, 125px yükseklik
$ Image \u003d ImageRreate (125, 125);

// arka plan rengini seçin
$ Blue \u003d ImageColorAlocate ($ Image, 0, 0, 255);

// Başka bir renge ayarlayın - sadece desen görüntülendiğinde, arka plan önce renk seti olacaktır ()
// Not - Meydan mavi, kırmızı değil.
$ red \u003d ImageColorAlocate ($ resim, 255, 0, 0);

// dosyayı PNG biçiminde kaydedin ve görüntüleyin.
imagePng ($ resim);

// kullanılan hafızayı temizleyin
imagedestroy ($ resim);
?>

Şimdi kullandığımızı daha iyi anlamak için kullanılan tüm fonksiyonları ve yukarıdaki kodun her adımı aşağıdakileri düşünelim:

Daha önce açıklandığım gibi, gerekirse onları hızlı bir şekilde düzeltmek için bir hata mesajı seçeneği ekliyoruz.
. Ardından, içerik türünü ayarlamak için başlık () işlevini kullanıyoruz - PNG
. Görüntüyü kaydederiz ve istenen genişlik ve yüksekliği takıyoruz - bkz. ImageRreate () daha ayrıntılı olarak.
. Ardından çizimimizin arka planı için mavi renk seçmek için ImageColorAlocate işlevini kullanın. Lütfen son sürümde ilk önce bir renk olacağını unutmayın, bu yüzden kariyemiz mavi değil, kırmızı değil.
. Resmin nihai depolanması için, imagePng () kullanıyoruz. Resmi herhangi bir dizinde kaydetmek istiyorsanız, ek parametreler girmelisiniz.
. Ve Son olarak, imageSestroy () işlevini kullanarak hafızayı temizliyoruz.

Blue_square.php dosyasını açarak kareye bakabiliriz ve ana sayfada bir bağlantı kurarsak daha iyi olacaktır:

Her şey doğru yapılırsa, bu mavi kareyi göreceksiniz:

Selam Dünya

Şimdi, görüntülerin nasıl oluşturulacağını öğrendiğimizde, seçtiğimiz yazı tipimiz tarafından yazılan metinle bir resim yapmaya çalışalım. Herhangi bir yazı tipini TrueType font (.tff) dizininden kullanabiliriz. Aşağıdaki örneklerde, 'Advent' yazı tipini kullanacağım. Koyu gri bir karede "Hello World" yazalım. Dikkat, koda bakın ve ardından her adımı detaylı olarak sökünüz.

ini_set ("Display_Errors", "1");
Error_reporting (e_all);


Başlık ("içerik türü: görüntü / png");

// Resmin boyutunu belirleme - 300x300 piksel

// arka planı koyu gri

// Yazı tipinin yolunu belirtin
$ Font_Path \u003d "Advent_light";

// Metin yazıyoruz
$ string \u003d "Hello World!";

// Metin ve resimleri bağlayın
İmagettftext ($ resim, 50, 0, 10, 160, $ beyaz, $ font_path, $ string);

// Resmi kaydet
imagePng ($ resim);

// hafızayı temizleyin
imagedestroy ($ resim);
?>

Kodu 'hello_world.php' dosyasına kaydedin, yukarıda listelendiği gibi aynı şekilde açacağız. Peki burada ne var?

300 * 300 piksel görüntü boyutunu ayarladık ve koyu gri bir arka plan kullandık
. Yazı tipi adını kullanarak yazı tipinin yolunu nasıl gösterdiğimizi unutmayın: Gerçek şu ki, kodda daha fazla resime metin uygulamak zorunda kalacağız. Ayrıca, yazı tipinin adının genişleme olmadan yazıldığını unutmayın. Bununla birlikte, GD kütüphanesinin hangi versiyonunun PHP kullandığına bağlıdır: Yazı tipinin adı '/' ile başlamazsa, TTF'yi uzatmak için gerekli olacaktır - yani, bu, bizim adından önce durmazsanız, Yazı tipi, sonunda TTF'ye otomatik olarak eklenecektir.
. Sonra "Hello World!" Yazıyoruz. ve daha fazla kullanım için metni kaydedin
. Bu kodda kullanılan en önemli işlev, ImageTFTFext (), parametrelerin 8 numaralı talimatlarını gerektirir: Görüntünün yolunu, görüntü boyutuna, eğim açısı, x ekseni, eksen Y, Renk, Yazı tipi, Metin (bu sırada)

Kodu kaydedin, herhangi bir şekilde açın ve bu resmi göreceksiniz:

Onu çevir!

Metni bağlayan ve görüntünün görüntüsünün bir açıda konumlandırılacak parametre olduğunu fark ettiniz "? Bu yüzden metnimi herhangi bir açıyla çevirebiliriz. Kodu tekrar yazalım ve çizgiyi kareye çevirin.

// Hata mesajlarını yükleyin
ini_set ("Display_Errors", "1");
Error_reporting (e_all);

// içerik türünü takın
Başlık ("içerik türü: görüntü / png");

// Resmin boyutunu belirleyin: 300x300 piksel
$ Image \u003d ImageCreate (300, 300);

// arka planın rengini belirleme - koyu gri
$ Dark_Grey \u003d ImageColorAlocate ($ Image, 102, 102, 102);
$ white \u003d ImageColorAlocate ($ resim, 255, 255, 255);

// Yazı tipinin yolunu belirtin
$ Font_Path \u003d "Advent_light";

// Metin yazıyoruz
$ string \u003d "Hello World!";

// Metin ve resimleri bağlayın
ImageTFTFTEXT ($ Image, 50, -45, 30, 70, $ Beyaz, $ Font_Path, $ string);

// Resmi kaydet
imagePng ($ resim);

// hafızayı temizleyin
imagedestroy ($ resim);
?>

Lütfen dikkat, 0 derece yerine -45 derece değerini ayarladık (önceki örnekte olduğu gibi) - metni açmak için gerekli olan her şey. Resme bak.

Nasıl? İlginç? Değil? O zaman daha pratik bir şey yapmaya çalışalım.

Bugün numara nedir?

Sadece resim çizemeyiz, aynı zamanda hazır kullanabilirsiniz! Biraz kodlama ve mevcut tarihi (ay, gün ve yıl) görüntüleyen bir takvimimiz olacak. Google'da bir takvim iş parçası arıyoruz, formatında bir görüntü buluyoruz .Svg - Boyutunu değiştirdim ve PNG formatına çevrildi. İş parçasına bakın:

Şimdi bir temelimiz var ve GD ve PHP işlevlerini kullanarak işleyebiliriz. Dünyadaki en büyük tasarımcının unvanı gibi davranmadığımı uyardım - belki diğer iş parçası ve başka bir yazı tipi sitede daha iyi görünecek. Böylece tasarım sizindir, ancak şimdilik koduna bakalım:

// Hata mesajlarını yükleyin
ini_set ("Display_Errors", "1");
Error_reporting (e_all);

// içerik türünü takın

// tarihi tut
Liste ($ ay, $, $ yıl) \u003d patlayabilir ("/", tarih ("F / J / Y"));

// arka plan görüntüsünü indirin
$ Image \u003d ImageRreatefrompng ("calendar_blank.png");
$ Image_Width \u003d Imagesx ($ Image);

// arka plan rengini ve yazı tipini belirleme
$ white \u003d ImageColorAlocate ($ resim, 255, 255, 255);
$ Black \u003d ImageColorAlocate ($ resim, 0, 0, 0);
$ Font_Path \u003d "Advent_light";

// metnin konumunu belirtin
$ Pos_month \u003d imagettfbbox (13, 0, $ font_path, $ ay);
$ Pos_day \u003d imagettfbbox (25, 0, $ font_path, $);
$ Pos_year \u003d imagettfbbox (8, 0, $ font_path, $ yıl);

// bir ay yazıyorum
İmagettftext ($ Image, 13, 0, ($ Image_Width - $ pos_month) / 2, 40, $ White, $ Font_Path, $ ay;

// yaz günleri
İmagettftext ($ Image, 25, 0, ($ Image_Width - $ pos_day) / 2, 80, $ Black, $ Font_Path, $ GÜNÜ;

// yıl yazıyoruz
İmagettftext ($ Image, 8, 0, ($ Image_Width - $ pos_year) / 2, 100, $ Black, $ Font_Path, $ Yıl);

// Resmi kaydet
imageJPEG ($ Image, "", 100);

// hafızayı temizleyin
imagedestroy ($ resim);
?>

Peki burada ne yapıyoruz? Liste () işlevi nedir? Hadi çözelim:

Her zaman olduğu gibi, fotoğrafın doğru görüntülenmesi için içerik türünü ayarladık.
. 10. satırda liste işlev özelliğini görüyorsunuz. Patlow () işlevini kullanarak tarih formatını tanımlıyoruz ve kaydettik. Böylece, herhangi bir bilgi ayarlayabilirsiniz. Şimdi mevcut ay, gün ve yıl hakkında bilgiye erişimimiz var.
. Dizeler 22-24'te, tarih biçimini düzenlemek için ImageTFBBox () işlevini kullanıyoruz. İşlev, tarihin belirtilen sırayla gösterilmesini sağlar ve sağ alt köşeye erişim için POS_MONTH yazarız. Tüm bunlar, metnin boyutundan bağımsız olarak, metnin otomatik olarak doğru yerleştirilmesi için gereklidir.
. Sonra her satırı sırayla oluştururuz ve metnin boyutunu X ekseni boyunca ayarlarız.

Hiçbir felaket oluşmadıysa, resmin bilgisayarınıza yüklü olanın tek farkı ile aşağıda sunulan resme sahip olmalısınız - çizimim, statik olarak tahmin edersiniz. Catpin sitesi sayesinde komut dosyasında yardım için.

Kediler ve görüntü filtreleri

Bugün size öğreteceğim son şey, bunlar resimlerin filtreleridir - çok ilginç bir şey, inan bana. ImageFilter () özelliği bitmiş görüntüyü alır ve belirli bir şekilde değiştirir - örneğin, siyah ve beyaz modda çevirir. Orijinal formunda çalışacağımız resme bakalım.

Şimdi görüntü filtreleme işlevini kullanarak bir kedi siyah ve beyaz yapalım.

// Hata mesajlarını yükleyin
ini_set ("Display_Errors", "1");
Error_reporting (e_all);

// Orijinal görüntünün ayarlanmış olup olmadığını kontrol edin
if (issas ($ _ almak ["kaynak"])) (
// çizimin temel işlemlerini gerçekleştirin
$ Image \u003d Filter_var ($ _ ["Kaynak"], filter_sanitize_string);

// Bir görüntü yükle
$ Image \u003d ImageCreatefromJPEG ($ Image);

// siyah ve beyaz moduna çevir
ImageFilter ($ Image, IMG_FILTER_GRAYSCALE);

// içerik türünü takın
Başlık ("İçerik tipi: image / jpeg");

// Resmi% 90 olarak tut
ImageJPEG ($ Image, "", 90);

// hafızayı temizleyin
imagedestroy ($ resim);
}
?>

Yukarıdaki komut dosyası yeterince esnektir, böylece herhangi bir çizim siyah ve beyazını kolayca yapabilirsiniz - böyle:

"Kaynak" herhangi bir resim koyduk ve yakında siyah ve beyaz olacak. Bu özelliği halka açık sunucularda kullanmayı planlayanlar, ek güvenlik önlemleri gerektirecektir. Yukarıdaki komut dosyasında bir tür tiptir. JPEG, herhangi bir grafik dosyasını işleme koymak için işlevi kullanabilirsiniz. Şimdi kedimiz şöyle görünüyor:

Diğer Filtreler:

Dersin sonunda, sizi diğer bazı grafik filtreler ve kullanım sonuçlarını tanıtacağım.

Parlaklık filtresi

Görüntünün parlaklığı için üçüncü parametreye karşılık gelir:


// Üçüncü parametre, görüntünün parlaklık seviyesini ayarlar.
Imagefilter ($ Image, Img_Filter_Brightness, 40);
ImageJPEG ($ Image, "", 90);
imagedestroy ($ resim);
?>

Gauss Bulanıklığı

Gauss üzerinde bulanıklık, ek parametreler yok

Başlık ("İçerik tipi: image / jpeg");

$ Image \u003d imagecreatefromjpeg ("cat.jpg");
ImageFilter ($ Image, Img_Filter_gaussian_Blur);
ImageJPEG ($ Image, "", 90);
imagedestroy ($ resim);
?>

Kontrast

Üçüncü parametre kontrastı belirler

Başlık ("İçerik tipi: image / jpeg");
$ Image \u003d imagecreatefromjpeg ("cat.jpg");
ImageFilter ($ Image, IMG_FILTER_CONTRAST, -15);
ImageJPEG ($ Image, "", 90);
imagedestroy ($ resim);
?>

Ortalama değerin çıkarılması (desen efekti)

Ek parametre yok.

Başlık ("İçerik tipi: image / jpeg");
$ Image \u003d imagecreatefromjpeg ("cat.jpg");
ImageFilter ($ Image, IMG_FILTER_MEAN_REMVAL);
ImageJPEG ($ Image, "", 90);
imagedestroy ($ resim);
?>

Renk dengesi

Aşağıdaki sırayla kırmızı, yeşil, mavi ve alfa kanalının (isteğe bağlı) doygunluğunu ayarlar.

Başlık ("İçerik tipi: image / jpeg");
$ Image \u003d imagecreatefromjpeg ("cat.jpg");
// ALPHA kanal parametresi İsteğe bağlı olduğu gibi aşağıda atlandı.
ImageFilter ($ Image, Img_Filter_Colorize, 50, 0, 0);
ImageJPEG ($ Image, "", 90);
imagedestroy ($ resim);
?>

Yeni toplantılara ...

Umarım PHP'deki GD Kütüphanesi ile az ya da çok başarılı olursunuz. İkinci bölümde, bazı gelişmiş tekniklere bakacağız ve elbette daha ilginç buluruz. GD kütüphanesini ve yaratıcı yeteneklerini kullanın ve bana neler olduğunu söylediğinizden emin olun!

Değerli Katılımcılar Projede hareket ediyor! Bugün başka bir ilginç konuyu bekliyorsunuz. Hepimiz, sosyal ağlarda yeni avatarlar yükleriz. Fakat istenen boyuta nasıl ölçeklendiriliyorlar? Sunucuda ne olur? Bunlar ve diğer birçok soru, kedinin altında sizi bekliyor.

Evet, eğer birisi farkında değilse, sonra internet terminolojisinde "kedi" (İngilizce kesme), bu haberi kısa bir (genel listede) ve eksiksiz bir sunum için paylaşan bir yerdir.

Birçoğu Kogir (COGEAR, http://cogear.ru) adlı kendi web sitesi yönetim sistemimi geliştirdiğimi biliyorum. Hikaye karmaşık ve uzun, ama inatla inatla hedefe gidiyor.

Görüntülerle çalışmanın temel yönlerini görelim.

PHP'nin dahili GD kütüphanesine sahiptir. İşte belgeleri:

http://php.net/manual/ru/book.Image.php.

Bu sayfada çok sayıda farklı işlev bulacaksınız. Ama korkma. Oldukça betonla ilgileniyoruz.

Gördüğünüz gibi, şimdiye kadar görüntülerle çalışmak prosedürler şeklinde (fonksiyonlar), böylece nesne yönelimli kabuk yazması gerekir.

Görüntü ile çalışma en basit örneği:

Yerel makineyi deniyoruz.

Bir dosya oluşturun. image.php.(Deneyler için yerel bir alanım var test.local).

Testin kökünü koyduk.Local Site Klasör: 1.jpg resmi:

Tarayıcıyı arayın http: //test.local/Image.php (durumunuzda, başka bir adres).

2.JPG klasöründe buluyoruz:

Oranlar, görebileceğiniz gibi korunmaz. Çünkü onları yeniden hesaplamadık.

Yeniden kurtarma gerçekleşmesi için komut dosyasını düzeltiriz:

$ ratio_orig) ($ width \u003d $ yükseklik * $ ratio_orig;) başka ($ yükseklik \u003d $ width / $ ratio_orig;) // ImageCopyResampled ($ Image_p, $) ölçeğinde bir değişiklikle web'deki dosyadan görüntüyü hareket ettirin ($ Image_P, $ Görüntü, 0, 0, 0, 0, $ genişlik, $ boy, $ width_orig, $ height_orig); // imageJPEG ($ Image_p, "2.jpg", 100);

Sonuç olarak bakalım:

Yükseklikte yeniden hesaplandığımızdan, son görüntünün bir kısmı siyah olduğu ortaya çıktı (yaratılan tuvalin orijinal rengi).

Görüntüyle başka ne yapabilirsin? Kes, çevirin, bir şeyi diğerine koyun, üzerine çizin.

Görüntülerle çalışmak için sınıfımla ilgileneceğinizden eminim. Dişli (modül) "görüntüler için bir sürücü olduğu için sistemin dışında çalışmaz.

Ama kendin için çok ilginç şeyler bulacaksın:

* @Copyright Telif Hakkı (c) 2012, Belyaev Dmitry * @ Lince http://cogear.ru/license.html * @Link http://cogear.ru * / class image_driver_gd uzantıları image_driver_abstract (/ ** * Bir resim oluşturur * / Kamu İşlevi Oluştur () (Case ImageType_JPEG: Case ImageType_JPEG2000: Case ImageType_JPEG2000: $ this-\u003e Source \u003d ImageCreatefromjpeg ($ this-\u003e info--\u003e dosya); Break; Case ImageType_png: $ this-\u003e Source \u003d ImageCreatefrompng ($ this- \u003e Info-\u003e Dosya); ImageColorTransparent ($ Bu-\u003e Source, ImageColorAlocate ($ Bu-\u003e Source, 0, 0, 0)); ImageEalphablending ($ Bu-\u003e Source, FALSE); ImagesAneAlfha ($ Bu-\u003e Kaynak, TRUE); Break; Case ImageType_Gif: $ Bu-\u003e Source \u003d ImageCreatefromgif ($ Bu-\u003e Info--\u003e Dosya); ImageColorTransparent ($ Bu-\u003e Source, ImageColorAlocate ($ Bu-\u003e Source, 0, 0, 0)); ImageEalphablending ($ this-\u003e kaynağı, false); imagesasavealpha ($ this-\u003e kaynağı, doğru); Break; Case ImageType_ico: $ this-\u003e Source \u003d ImageCreatefromwbmp ($ this-\u003e info-\u003e dosya); Break;)) / ** * Görüntüyü yok eder * / Kamu işlevi yok () (ImageDestroy ($ Bu - Kaynak); İs_resource ($ this-\u003e hedef) && imagedestroy ($ this-\u003e hedef); ) / ** * Hedef bir görüntü oluşturur * * @param karışık $ genişlik * @param karışık $ yükseklik * / Halk fonksiyonu Createtetarget ($ genişlik, $ yükseklik) ($ Bu-\u003e Hedef \u003d ImageCreatUsolor ($ genişlik, $ yükseklik); Eğer ($ this-\u003e info-\u003e type \u003d\u003d imagetype_png veya imagetype_gif \u003d\u003d $ this-\u003e info-\u003e tür) (ImageColorTransparent ($ Bu-\u003e Hedef, ImageColoralocate ($ Bu-\u003e Hedef, 0, 0, 0)) ; ImageEalphabling ($ this-\u003e hedef, yanlış); imagesavealpha ($ this-\u003e hedef, true);) $ this-\u003e hedef;) / ** * Görüntünün ölçeğini değiştirir * * @param int | dize $ Genişlik Genişliği * @ PARAM INT | Dize $ Yükseklik Yüksekliği * @Param String $ Fit Genişlik Ölçeklendirme Tipi, Yükseklik, Fit * @param Int | String $ Ölçekleri Hangi resimlerin ölçeklendirilmesi, yukarı, aşağı * @return nesne görüntüsü * / Genel işlev yeniden boyutlandırma ($ Width, $ yükseklik, $ fit \u003d "width", $ scale \u003d "herhangi bir") ($ source_width \u003d $ this-\u003e SmartSize ($ genişlik, "genişlik"); $ source_height \u003d $ this-\u003e SmartSize ($ yükseklik , "Yükseklik"); // Anahtar ölçekleme türünü ($ Fit) kontrol edin (// alırsanız Tırnak genişliği, daha sonra istenen oranlar "genişlik": $ width \u003d $ source_width; $ Yükseklik \u003d tur ($ source_width * $ Bu-\u003e Info-\u003e Yükseklik) / $ Bu-\u003e Info-\u003e Genişliği; Kırmak; // eğer yükseklik montajı, daha sonra istenen durumların "yükseklik" bölümünün genişliğini verirse: $ width \u003d round ((((($ Bu-\u003e Info-\u003e Genişlik * $ Source_Height) / $ Bu-\u003e Info-\u003e Yükseklik ); $ Yükseklik \u003d $ source_height; Kırmak; Kılıf "Kırpma": ($ Bu-\u003e Info-\u003e Genişliği\u003e $ Bu-\u003e Info-\u003e Yüksekliği) ($ Width \u003d Round ((($ Bu-\u003e Info-\u003e Genişlik * $ Source_Height) / $ Bu-\u003e bilgi -\u003e yükseklik); $ yükseklik \u003d $ source_height;) başka ($ width \u003d $ source_width; $ yükseklik \u003d yuvarlak (((($ -\u003e info-\u003e yükseklik * $ source_width) / $ this-\u003e info-\u003e genişliği; ) Break; // varsayılan biz varsayılan varsayılandır: durum "Fit" :) // Anahtarın yapılıp yapılmayacağını ($ ölçeklendirilip "olup olmadığını kontrol edin (resim belirtilen boyutlardan daha büyükse, hiçbir şey" yukarı "olmaz: $ genişlik< $this->info-\u003e genişlik ve $ yükseklik< $this-> İnfo-\u003e yükseklik) (bu $ değerini döndürün;) Break; // Bir görüntü belirtilen boyutlardan daha küçükse, hiçbir şey "aşağı" olarak gerçekleşmezse: ($ genişlik\u003e $ this-\u003e info-\u003e genişliği && $ yüksekliği\u003e $ this-\u003e info-\u003e yüksekliği) ($) bu;) ara; Kılıf "Herhangi bir": Varsayılan: // Hiçbir şey yapmayın. KILOM) $ BU-\u003e HEDEF \u003d $ BU-\u003e Createtarget ($ genişlik, $ yükseklik); İf (görüntü\u003e hedef, $ this-\u003e kaynağı, 0, 0, 0, 0, $ genişlik, $ yükseklik, $ this-\u003e info-\u003e genişlik, $ this-\u003e info-\u003e yükseklik))) ($ this-\u003e Kaynak \u003d $ Bu-\u003e Hedef; $ Bu-\u003e Info-\u003e Genişliği \u003d $ genişlik; $ Bu-\u003e Info-\u003e Yükseklik \u003d $ Yükseklik; eğer ("kırpma" \u003d\u003d $ fit) (BU BU -\u003e Kırpma ( "Merkez", "merkezi", $ source_width, $ source_height);)) Buna geri dönün; ) / ** * @param karışık $ x koordinat kesim x * @param karışık $ y koordinat kırpma y * @param karışık $ genişlik kırpma yüksekliği * @param karışık $ yükseklik budama yüksekliği * @Param karışık $ yükseklik budama yüksekliği * @Param Karışık $ Yükseklik Budama Yüksekliği * @Param Karışık $ Yükseklik Budama Yüksekliği * @Param Karışık $ Yükseklik Budama Yüksekliği * @Param Karışık $ Yükseklik Budama Yüksekliği * @Param Karışık $ Yükseklik Budama Yüksekliği * @Param / Genel fonksiyon mahsulü ($ x, $ y, $ genişlik, $ yükseklik) ($ x \u003d $ this-\u003e SmartSize ($ x, "genişlik") - $ width / 2; $ y \u003d $ this-\u003e SmartSize ($ Y, "yükseklik") - $ yükseklik / 2; $ width \u003d $ this-\u003e SmartSize ($ genişlik, "genişlik"); $ yükseklik \u003d $ this-\u003e SmartSize ($ yükseklik, "yükseklik"); $ this-\u003e Hedef \u003d $ Bu-\u003e Createtarget ($ genişlik, $ yükseklik); if-\u003e hedef, $ this-\u003e kaynağı, 0, $ x, $ y, $ genişlik, $ yükseklik, $ genişlik, $ yükseklik)) ($ buna -\u003e Kaynak \u003d $ Bu-\u003e Hedef; $ Bu-\u003e Info-\u003e Genişlik \u003d $ genişlik; $ Bu-\u003e Info-\u003e Yükseklik \u003d $ Yükseklik;) $ Buna geri dönün;) / ** * Maging images * / Genel fonksiyon Birleştirme (resim $ görüntü, $ x, $ y, $ '\u003d 100) ($ x \u003d $ this-\u003e SmartSize ($ x, "genişlik"); $ y \u003d $ this-\u003e SmartSize ($ y, "yükseklik" ); if- (ImageCopygerge ($ this-\u003e kaynak, $ Image-\u003e getource (), $ x, $ y, 0, 0 , $ Image-\u003e Nesne () -\u003e Image-\u003e Genişlik, $ Image-\u003e Nesne () -\u003e Image-\u003e Yükseklik, $ yüzde))) () $ Buna geri dönün; ) / ** * Bir görüntüyü kaydeder * / Halk işlevi kaydet ($ dosya \u003d , $ options \u003d dizi ()) ($ Bu-\u003e Hedef veya $ Bu-\u003e Hedef \u003d $ Bu-\u003e Kaynak; eğer (stppos ($ Dosya, ".") Veya $ dosya \u003d $ this-\u003e info-\u003e dosya) ($ ext \u003d pathfo ($ dosya, pathfo_extension); $ ext \u003d strtolower ($ ext);) başka ($ ext \u003d strtolower ($ dosya) ); $ dosya \u003d null;) anahtarı ($ ext) (vaka "JPG": Kılıf "JPEG": $ Seçenekler veya $ Seçenek \u003d 90; ImageJPEG ($ Bu-\u003e Hedef, $ Dosya, $ Seçenekler); Break; Case "GIF": ImageColorTransparent ($ Bu-\u003e Hedef, ImageColorallocateAlfa ($ Bu-\u003e Hedef, 0, 0, 127)); Imagedphablending ($ Bu-\u003e Hedef, Yanlış); ImagesAneAlfha ($ Bu-\u003e Hedef, Doğru); İmagegif ($ this-\u003e hedef, $ dosyası); Break; vaka "png": ImageEalphableending ($ this-\u003e hedef, yanlış); imagesasavealpha ($ this-\u003e hedef, true); eğer (IS_Numeric ($ Seçenekler)) ( $ Kalite \u003d $ seçenekleri; $ filtreler \u003d png_no_filter;) başka ($ kalite \u003d issas ($ seçenek ["kalite])? $ Seçenekleri ["kalite"]: 9; $ Filtreler \u003d issas ($ seçenek ["filtreler"])? $ Seçenekleri ["filtreler"]: png_no_filter; ) imagePng ($ this-\u003e hedef, $ dosyası, $ kalite, $ filtreler); Kırmak; ) $ Bu-\u003e yok (); ) / ** * Bir görüntü görüntüler * / Genel fonksiyon çıkışı ($ format, $ seçenek) ($ this-\u003e Kaydet ($ format, $ seçenekleri);))))

Sistemde nasıl çalışır? Çok fazla kod nedir?

Görmek:

$ Image \u003d Yeni Resim ("1.jpg"); $ Image-\u003e Yeniden Boyutlandır (200,200, "genişlik") -\u003e Kırp (200,200) -\u003e Kaydet ("2, JPG);

Anlıyor musunuz? Gerekli tüm formatlarda otomatik olarak çalışır. İşlevsel, gerekirse, genişletilebilir.

Sizin için ödev, yerel makinede yukarıda (sınıfıma) belirtilenleri yapacaktır. Eğer parametrelerle denemeyi isterseniz ve zamanınız.