Krijimi i filigranëve duke përdorur PHP. PHP: Watermarking Zbatimi i filigranizimit duke përdorur PHP

Në disa raste, shtimi i filigranëve në imazhet që postoni në faqen tuaj është mënyra e vetme për t'i mbrojtur ato disi nga vjedhja. Për më tepër, ata thonë se filigranë të tillë tërheqin trafik shtesë.

Ka shumë mënyra për të krijuar një filigran në një imazh duke përdorur PHP, por klienti im kishte nevojë për një metodë aplikimi që do t'i lejonte atij të ndryshonte filigranin në një të ri në çdo kohë.

Siç rezulton, ekziston një zgjidhje e tillë.

Kjo zakonisht përdoret nga njerëz që zhvillojnë faqe interneti me përmbajtje kryesisht grafike.

Zgjedhja e një metode filigrani

Problemi me zbatimin e gjithë kësaj rrëmujë është zgjedhja e mënyrës se si të aplikohet filigrani midis performancës dhe fleksibilitetit. Thjesht nuk ka zgjidhje ideale që do t'i përshtatet të gjithëve. Kjo është arsyeja pse ka shumë zbatime.

Në rastin tim, klienti rezervon të drejtën për të riemërtuar në çdo kohë dhe në vend të kësaj "Brirët dhe thundrat" shkruaj "Tundet dhe brirët". Metoda e vulosjes që zgjidhni duhet ta tolerojë këtë gjithashtu.

Thelbi i teknologjisë së filigranit të përshkruar këtu është të shtohet pikërisht kjo shenjë sa herë që ngarkohet një imazh. Po, kjo metodë mbart një sërë kufizimesh që mund të ndikojnë ndjeshëm në performancën, por siç thonë ata, klienti ka gjithmonë të drejtë dhe prandaj nëse ato. detyra kërkon aplikimin dinamik të një filigrani, atëherë kjo është pikërisht ajo që duhet bërë.

Nëse dikush ka një mënyrë më të lehtë, atëherë jeni të mirëpritur të komentoni. Do të jetë interesante të dëgjoni.

Para se të paraqes disa kode, do të doja të përshkruaj avantazhet, si dhe të jap një shembull pune.

Të mirat:

  • ju mund të ndryshoni filigranin të paktën 500 herë në ditë;
  • mund të vendoset në çdo CMS (nuk është i lidhur me të në asnjë mënyrë).

Minuset:

  • varet nga performanca e pritjes (nëse keni shumë imazhe ose ato janë me rezolucion të lartë, kjo mund të sjellë një ngarkesë të konsiderueshme në server);
  • një mendje kureshtare do të jetë ende në gjendje të heqë filigranin tuaj.

Konkluzione: për postimin e një numri të vogël imazhesh me filigranë, kjo metodë është e përsosur, por nëse do të hapni një galeri fotografish, atëherë do të ishte më mirë të kërkoni diçka më pak të ngarkuar.

Shembull

Zbatimi i një filigrani duke përdorur PHP

Siç u premtua, nuk keni nevojë të keni ndonjë njohuri të veçantë për këtë, ju duhet:

  1. skedar, i cili është në arkiv dhe vendoseni në direktorinë rrënjë të faqes tuaj;
  2. Ne vendosim imazhin që do të veprojë si filigran në direktorinë rrënjësore të faqes dhe e emërtojmë atë (në rastin tim është një goditje e bardhë brushë, kështu që lidhja mund të mos jetë e dukshme në sfondin e shfletuesit tuaj). Imazhi duhet të jetë PNG, pasi ka një shtresë transparente. Nëse dëshironi të përdorni GIF, duhet të redaktoni skedarin imazh.php;
  3. në vendin ku dëshironi të shfaqni imazhin me filigran, vendosni kodin:

Kjo eshte e gjitha. Të gjithë janë të lumtur, si ju ashtu edhe klienti.

Nëse dëshironi të shtoni një filigran në një foto pa u shqetësuar me redaktuesit e imazheve ose duke e shtuar atë gjatë ngarkimit të fotove në server, atëherë ky tutorial është për ju.

Në këtë tutorial do t'ju tregoj se si të shtoni një filigran në një imazh në fluturim pa ndryshuar në fakt imazhin origjinal. Para së gjithash, do t'ju duhet një imazh për t'u përdorur si filigran.

Pastaj formojmë kokën e skedarit:

// kjo linjë do t'i tregojë shfletuesit se po kalojmë një kokë të imazhit jpg ("content-type: image/jpeg");

Pastaj gjenerojmë një imazh png dhe marrim dimensionet e tij:

// krijoni një filigran në formatin png $watermark = imagecreatefrompng("watermark.png"); // merrni gjerësinë dhe lartësinë $watermark_width = imagesx($watermark); $watermark_height = imagesy($ujëra);

Ne do të bëjmë të njëjtën gjë me imazhin origjinal, por vetëm në formatin jpg. Kjo është e zakonshme për fotot që ngarkohen përmes një formulari. Ne vazhdojmë si më poshtë:

// krijimi i një imazhi jpg $image_path = "origjinal.jpg"; $image = imagecreatefromjpeg($image_path); // merrni madhësinë e imazhit $size = getimagesize($image_path);

Tani duhet të vendosim një filigran në imazh:

// vendosni një filigran në fund djathtas. Indenti 5px $dest_x = $madhësia - $gjerësia_ujore - 5; $dest_y = $madhësia - $ujore_lartësia - 5;

Më pas, le të vendosim opsionet e përzierjes për të dy imazhet:

Imagealphablending ($image, e vërtetë); imagealphablending ($ ujëra, e vërtetë);

Më në fund ne krijojmë një imazh të ri duke përdorur parametrat:

// krijoni një imazh të ri imazhi ($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg ($image);

Është e rëndësishme të pastroni veten:

// liro memorie imagedestroy($image); imagedestroy ($ ujëra);

Mund të përdorni Photoshop për të rregulluar transparencën e filigranit.

Kjo është e gjitha me teorinë. Tani le të zbatojmë njohuritë tona në një projekt real. E gjithë kjo duhet të ruhet në një skedar. Për shembull, i quajtur filigran.php

Header ("lloji i përmbajtjes: imazh/jpeg"); // merrni emrin e imazhit nëpërmjet GET $image = $_GET["imazh"]; // krijoni një filigran $watermark = imagecreatefrompng("watermark.png"); // merrni lartësinë dhe gjerësinë e filigranit $width_width = imagesx($watermark); $watermark_height = imagesy($ujëra); // krijoni një jpg nga imazhi origjinal $image_path = "/path/to/image/folder/" . $image; $image = imagecreatefromjpeg($image_path); //nëse diçka shkon keq nëse ($image === false) ( return false; ) $size = getimagesize($image_path); // vendosni një filigran në imazhin $dest_x = $size - $watermark_width - 5; $dest_y = $madhësia - $ujore_lartësia - 5; imagealphablending ($image, e vërtetë); imagealphablending ($ ujëra, e vërtetë); // krijoni një imazh të ri imazhi ($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg ($image); // liro memorie imagedestroy($image); imagedestroy ($ ujëra);

Tani, për të shfaqur një foto me një filigran pa ndryshuar imazhin origjinal, përdorni kodin e mëposhtëm.

Ka një numër të madh imazhesh në internet, të cilat zakonisht ngarkohen nga pronarët e faqeve ose përdoruesit e faqes. Në varësi të rëndësisë së tij, imazhi mund të migrojë nga një sajt në tjetrin. Për të mos përmendur të drejtat e autorit, jo çdo pronari të faqes mund të pëlqejë faktin që imazhet nga faqja e tij kopjohen në burime të tjera. Si një mjet për të luftuar kopjimin banal të imazheve të faqes, u shpik për të aplikuar filigranë në imazhe, duke treguar se imazhi i përket një burimi të veçantë. Kjo mund të jetë veçanërisht e vërtetë për faqet që kanë një numër të madh imazhesh unike.

Le të shohim një shembull kodi që demonstron aplikimin e një filigrani në imazhet e shkarkuara.

Pra, cilësimet kryesore përmbahen në formën e konstanteve dhe vijnë së pari në kod:

// rruga për në imazhin e filigranit define("WATERMARK_OVERLAY_IMAGE", "/lab/watermark/watermark.png"); // Kompresimi, diapazoni 0-100 (ndikon në cilësinë e imazhit) define ("WATERMARK_OUTPUT_QUALITY", 100); // dosje me imazhe burimore define("UPLOADED_IMAGE_DESTINATION", "/lab/watermark/upload/src/"); // dosje me imazhe të përpunuara define("WATERMARK_IMAGE_DESTINATION", "/lab/watermark/upload/");

Në faqe do të vendosim një formular të ngarkimit të imazheve, përmes të cilit imazhet do të dërgohen në server.
Kodi i formularit:

Zgjidhni skedarin e imazhit:
Imazhi origjinal
" style="max-width: 300px;" />
Imazhi me filigranë
" style="max-width: 300px;" />

Epo, tani gjëja më e rëndësishme janë funksionet për përpunimin e imazhit. Këto funksione duhet të vendosen përpara se të shfaqet formulari në faqe.

Dy funksione kryesore, me njërën, imazhi ngarkohet në server, me tjetrin, aplikohet një filigran. Ndoshta komentet për funksionet përshkruhen më në detaje, dhe do të ishte e tepërt të shkruanim të njëjtën gjë këtu.

Pronarët e faqeve të internetit (forume, tabela mesazhesh, etj.) shpesh përballen me problemin e krijimit të filigranëve në të gjitha imazhet e mëdha të faqes.

Sigurisht, ju mund ta zgjidhni këtë problem duke krijuar manualisht një filigran në secilën imazh, megjithatë, së pari, kjo kërkon shumë kohë, dhe së dyti, bëhet e nevojshme të ruhen dy versione të figurës, me dhe pa filigran.

Një zgjidhje për këtë problem mund të jetë aplikimi dinamik i një filigrani në imazh përpara se ta transmetojë atë te vizitori i faqes.

Ekziston një zgjidhje për këtë problem në internet në formën e dy skedarëve, përmbajtja e të cilave jepet më poshtë.
Kodi burimor i skedarit ".htaccess".

DirectoryIndex index.php RewriteEngine On RewriteCond %(REQUEST_FILENAME) -f RewriteRule ^(.*)$ /watermark/_watermark.php

Kodi burimor i skedarit "_watermark.php"

250) && ($info_o > 250)) ( // Për imazhet pa kanal alfa // Parametri i fundit i funksionit është shkalla e tejdukshmërisë së filigranit imageCopyMerge($out, $watermark, ($info_o-$info_w)/ 2, ($info_o -$info_w)/2, 0, 0, $info_w, $info_w, 25 // Për imazhet me kanal alfa // Në këtë rast, transparenca rregullohet nga kanali alfa i figurës); vetë // imageCopy($out, $watermark, ($info_o-$info_w)/2, ($info_o-$info_w)/2, 0, 0, $info_w, $info_w ) çelësi ($info_o) ( rasti 1: imageGIF($out) case 2: imageJPEG($out); imageDestroy ($origjinal); imageDestroy ($ ujëra); kthehu i vërtetë; ) ?>

Zgjidhja zbret në sa vijon: skedari “.htaccess” vendoset në drejtorinë me skedarët e imazhit. Përveç tij, në server krijohet një dosje "ujëra", në të cilën ekziston një skedar skripti "_watermark.php" dhe skedari aktual i filigranit "watermark.png".

Në të njëjtën kohë, në krahasim me versionin origjinal të gjetur në internet, bëra ndryshime të vogla në të dy skedarët e tekstit.

Në skedarin ".htaccess", shprehjes së rregullt për kërkimin e skedarëve të imazhit i është shtuar ekstensioni "jpeg", ashtu siç ndeshet shpesh.

Skripti "_watermark.php" është ripunuar në atë mënyrë që të vendoset filigrani në qendër të imazhit (kjo kërkohej nga specifikat e problemit që po zgjidhej) dhe aftësia për të rregulluar transparencën e filigranit të krijuar ka është shtuar (komentet në trupin e skenarit do t'ju ndihmojnë të konfiguroni vetë këtë parametër).

Gjithashtu duhet t'i kushtoni vëmendje faktit që vendosja e dosjes "watermark" në dosjen me imazhe, siç këshillojnë burimet origjinale, nuk do të arrijmë rezultatin e dëshiruar, sepse në këtë rast do të duhet të kemi skedarin e tij ".htaccess" dhe dosjen "watermark" në çdo dosje. Kjo është për shkak të faktit se skedari ".htaccess" specifikon shtigjet absolute nga direktoria rrënjësore e faqes në skedarin "_watermark.php". Kështu, duke pasur një nënfolder të veçantë "ujëra" në çdo dosje me imazhe, nëse duhet të ndryshojmë filigranin (ose skriptin që e mbivendos atë në imazh), do të duhet të bëjmë ndryshime në të gjitha dosjet.

Për të shmangur këtë problem, unë rekomandoj të krijoni një dosje "watermark" në direktoriumin rrënjë të faqes dhe të vendosni një skedar ".htaccess" në drejtoritë e imazheve pa pasur nevojë ta ndryshoni atë çdo herë. Në këtë rast, për të ndryshuar filigranin ose skriptin, do të na duhet të bëjmë ndryshime vetëm në një vend të faqes. Në këtë rast, ju mund të krijoni filigranë të ndryshëm për dosje të ndryshme me imazhe duke iu referuar skedarëve të ndryshëm “.htaccess” te skriptet e ndryshme, për shembull “_watermark-1.php”, “_watermark-2.php”, etj.

Kështu, për të përmbledhur, mund të themi se për të aplikuar filigranë në të gjitha imazhet e faqes, duhet të shkarkoni arkivin e bashkangjitur më poshtë, ta shpaketoni atë, të vendosni dosjen "ujëra" në direktorinë rrënjë të faqes, të zëvendësoni skedarin e filigranëve " watermark.png” në të me tuajin dhe vendosni skedarin “.htaccess” në ato direktori faqesh, imazhet nga të cilat duhet të shënohen me ujëra.

Këtu mund të shkarkoni arkivin që përmban të gjithë skedarët e nevojshëm

Një nga gjërat interesante që mund të bëni me bibliotekën grafike PHP GD është një klasë që vendos filigranë në një imazh. Me pak fjalë, filigrani është një teknologji për mbrojtjen e imazheve dixhitale nga përdorimi i paautorizuar duke shtuar filigranë ose nënshkrime në to. Si pasojë e kësaj, ajo mund të përdoret (dhe përgjithësisht përdoret) për të përcaktuar pronarin e të drejtës së autorit në një imazh. Pra, le të vazhdojmë.

Prezantimi

Në këtë fazë të zhvillimit të saj, PHP u ofron programuesve një gamë të gjerë funksionesh për gjenerimin dinamik të imazheve dhe punën me to. Në këtë artikull do t'ju tregoj një teknikë për krijimin e një klase që do të vendosë filigranë në të njëjtat imazhe. Kjo klasë do të punojë me dy imazhe: origjinalin dhe filigranin. Si shtesë, është prezantuar një parametër i tretë - klasa jonë do të përmbajë një ndryshore alfa. Kjo do të na lejojë të përdorim një kanal alfa për filigranin tonë.

Per referim

kanal alfa: pjesë e një imazhi që ruan informacion në lidhje me transparencën e pjesëve individuale të imazhit, ndërsa kanalet me ngjyra ruajnë informacione për ngjyrën e imazhit. Në redaktorët grafikë përdoret për të maskuar (mbrojtur nga redaktimi) një zonë të caktuar të imazhit. Në disa aplikime ato quhen maskë transparente.

Informacioni i gjetur në kanalin alfa më së shpeshti përfaqëson zonat e theksuara - një formë ose rregullim të zonave me ngjyra. Ruajtja e një kanali alfa në një imazh rrit madhësinë e skedarit me 1/3. Imazhet RGB mund të kenë deri në 24 kanale alfa. Bitmaps dhe imazhet e indeksuar nuk mund të përmbajnë kanale alfa.

Pjesa e parë - Bazat

Para se të fillojmë të shkruajmë vetë klasën, le të shqyrtojmë funksionet që do të përdoren në të. Këtu është lista e tyre:

# kthen gjerësinë dhe lartësinë e imazhit imagesx() imagesy() # krijon një imazh të ri me ngjyrë të vërtetë imagecreatetruecolor # kthen një grup shoqërues me çelësat e kuq, jeshil dhe blu (+ kanal alfa) që përmban vlerat përkatëse për indeksi i specifikuar i ngjyrave imagecolorsforindex() # kthen indeksin e ngjyrës së një piksel në një vend të caktuar në imazhin imagecolorat() # vizaton një piksel të vetëm të ngjyrës së dhënë imagesetpixel() # kthen indeksin e indeksit të ngjyrës në paletën e imazhit, identifikuesi i ngjyrës (i përbërë nga komponentët e tij RGB), dhe indeksi i ngjyrës së paletës së imazhit që është "më afër" me vlerën RGB (këto të dhëna janë të nevojshme për funksionin imagesetpixel()) imagecolorexact() imagecolorallocate( ) imagecolorclosest()

Siç mund ta shihni, php ka mjaft funksione për të punuar me grafikë. Edhe pse qëllimi i disa prej tyre nuk është plotësisht i qartë në teori, në praktikë gjithçka është shumë më e thjeshtë. Prandaj, për të kuptuar se si të punojmë me ta, ne do t'i zbatojmë ato në klasën tonë.

Zgjedhja e rrugës drejt qëllimit

Tani që kemi vendosur tashmë për qëllimin e "mini-projektit" tonë, le të kthehemi pak prapa dhe të flasim për mënyrat për ta zbatuar atë.

Për të filluar, aplikacioni ynë merr dy imazhe - imazhin origjinal dhe vetë filigranin. Më pas, duhet të përcaktojmë dimensionet e këtyre imazheve (gjerësi-gjerësi dhe lartësi-lartësi). Ne kemi nevojë për këto të dhëna për të vendosur filigranin në qendër të imazhit (bazuar në supozimin se madhësia e filigranit do të jetë më e vogël se vetë imazhi).

Pastaj do t'ju duhet të aplikoni filigranin tonë në imazhin origjinal. Për ta bërë këtë, do të na duhet të shtojmë ngjyrat e imazheve të mbivendosura (matematikisht) për të marrë një të tretë.

Dhe në fund, do të na duhet të shfaqim imazhin që rezulton në shfletues. Në këtë rast, fotografia do të hapet direkt nga burimi i specifikuar në etiketën " "

Unë mendoj se teoria tashmë është e mjaftueshme - pikat kryesore në të janë zbuluar në detaje të mjaftueshme. Tani le të kalojmë në shkrimin e skenarit.

Pjesa e dytë - shkrimi i një skenari

Le të fillojmë me gjënë më të thjeshtë - të shkruajmë një klasë që krijon një skedar me një filigran. Le ta quajmë "ujëra" dhe ta shkruajmë kodin e tij në skedarin "api.watermark.php". "Skeleti" i klasës do të jetë tre funksione:

Hapi tjetër është të shkruhet kodi për funksionet e klasës "watermark". Ne plotësojmë skedarin "api.watermark.php" me linjat e mëposhtme të kodit:

# funksion që bashkon dy imazhe burimore në një funksion create_watermark($main_img_obj, $watermark_img_obj, $alpha_level = 100) ( # konverto vlerën e transparencës së kanalit alfa nga % në dhjetëra $alpha_level/= 100; # llogarit dimensionet e imazhit (gjerësia dhe lartësia ) $kryesore_img_w = ​​imazhex($main_img_obj_h = imagesy($watermark_img_obj_w = imagesx($watermark_img_obj_im) $watermark_img_obj_w/2)); main_img_obj_x=tavan(($main_img_obj_w/2)+($watermark_img_obj_w/2) $main_img_obj_max_y=tavan(($kryesore_img_obj_h/2)+($just_img_n_im)); ngjyra ($main_img_obj_w, $main_img_obj_h imazh me ujëra kthen $return_img); ) # fundi i funksionit create_watermark()

Tani le të hedhim një vështrim më të afërt në funksionin create_watermark().

Para së gjithash, ne i kalojmë tre parametra:

# imazhi origjinal që do të vendoset në ujëra $main_img_obj # vetë filigrani duhet të përmbajë një kanal alfa $watermark_img_obj # vlerën e transparencës së kanalit alfa të filigranit, (0-100, parazgjedhja = 100) $alfa_level

(Është e rëndësishme të theksohet se funksioni ynë pranon imazhet si objekte, jo vetëm shtigjet drejt tyre - por më shumë për këtë më vonë)

Hapi tjetër është krijimi i një imazhi të ri, me ngjyrë të vërtetë, me të njëjtat dimensione si imazhi origjinal. Ky imazh (ndryshorja $return_img) do të përdoret për të kombinuar informacionin nga imazhet origjinale (vizatimi dhe filigrani).

Por para kësaj, ju ende duhet të "kaloni" secilën nga dy imazhet fillestare dhe t'i "bashkoni" ato në një. Është shumë herët për ta bërë këtë - ne nuk jemi ende gati për këtë. Në vend të kësaj, ne do të postojmë një koment "disa kod" dhe më pas do ta mbushim atë hapësirë ​​me një seksion kodi.

Rezultati përfundimtar është se imazhi ynë i modifikuar do të shfaqet në faqen e internetit që e kërkon atë. Më tej, le të shohim dy funksionet e mbetura ndihmëse.

Pjesa e tretë - Funksionet ndihmëse

Përveç funksionit create_watermark, klasa jonë e filigranit përmban edhe dy funksione të tjera. Le të vazhdojmë kodin burimor të klasës me rreshtat e mëposhtëm:

# mesatarja e dy ngjyrave duke marrë parasysh transparencën e funksionit të kanalit alfa _get_ave_color($color_a, $color_b, $alpha_level) (raundi i kthimit ((($color_a*(1-$alpha_nivel))+($color_b*$alpha_level)) ) # ktheni vlerat e komponentëve më të afërt RGB të funksionit të ri të imazhit _get_image_color($im, $r, $g, $b) ($c=imagecolorexact($im, $r, $g, $b); nëse ($c!=- 1) kthej $c=imagecolorallocate($im, $r, $g, $b); , $g, $ b);

Dhe tani më shumë detaje. Funksioni ynë i parë "_get_ave_color" merr vlerat numerike të dy ngjyrave dhe një kanali alfa. Ai kthen vlerën e tyre mesatare. Ne kemi nevojë për këtë funksion për të përcaktuar ngjyrën që do të fitohet kur pikselat e dy fotografive janë mbivendosur.

Funksioni i dytë "_get_image_color" e ndan imazhin në komponentë të kuq (e kuqe), jeshile (jeshile) dhe blu (blu) (paleta rgb). Duke përdorur funksionet e integruara në PHP për të punuar me grafikë (përshkrimi i tyre ishte në fillim të artikullit), marrim vlerën më të afërt të ngjyrës për imazhin e ri.

Përveç kësaj, kontrollohen edhe disa pika. Së pari, nëse ka qenë e mundur të merret vlera e saktë (ndryshorja $c), atëherë ajo kthehet nga funksioni (kthimi $c). Përndryshe, bëhet një përpjekje për të zgjedhur një ngjyrë duke përdorur funksionin imagecolorallocate(). Nëse kjo nuk ndihmon në arritjen e rezultatit, atëherë duke përdorur funksionin imagecolorclosest() thjesht kthehet vlera më e afërt e ngjyrës (më e pasakta).

Epo, klasa jonë është pothuajse gati. Gjithçka që mbetet është të zëvendësoni komentin "disa kod" në funksionin "create_watermark" me rreshtat e mëposhtëm:

# kaloni nëpër imazhin për ($y = 0; $y< $main_img_obj_h; $y++) { for ($x = 0; $x < $main_img_obj_w; $x++) { $return_color = NULL; # определение истинного расположения пикселя в пределах # нашего водяного знака $watermark_x = $x - $main_img_obj_min_x; $watermark_y = $y - $main_img_obj_min_y; # выбор информации о цвете для наших изображений $main_rgb = imagecolorsforindex($main_img_obj, imagecolorat($main_img_obj, $x, $y)); # если наш пиксель водяного знака непрозрачный if ($watermark_x >= 0 && $ujëra_x< $watermark_img_obj_w && $watermark_y >= 0 && $ujë_y< $watermark_img_obj_h) { $watermark_rbg = imagecolorsforindex($watermark_img_obj, imagecolorat($watermark_img_obj, $watermark_x, $watermark_y)); # использование значения прозрачности альфа-канала $watermark_alpha = round(((127-$watermark_rbg["alpha"])/127),2); $watermark_alpha = $watermark_alpha * $alpha_level; # расчет цвета в месте наложения картинок $avg_red = $this->_get_ave_color($main_rgb["e kuqe"], $watermark_rbg["e kuqe"], $watermark_alpha); $avg_green = $this->_get_ave_color($main_rgb["jeshile"], $watermark_rbg["jeshile"], $watermark_alpha); $avg_blu = $this->_get_ave_color($main_rgb["blu"], $watermark_rbg["blu"], $watermark_alpha); # duke përdorur të dhënat e marra, llogaritni indeksin e ngjyrave $return_color = $this->_get_image_color($return_img, $avg_red, $avg_green, $avg_blu); # nëse nuk mund të zgjedhim një ngjyrë, atëherë thjesht marrim # një kopje të pikselit origjinal) tjetër ( $return_color = imagecolorat($main_img_obj, $x, $y); ) # nga pikselët që rezultojnë ne nxjerrim një imazh të ri setpixel ($kthimi_img, $x, $ y, $kthimi_ngjyra); ) )

Pasi të keni shkruar një pjesë kaq të rëndësishme të kodit, mund të ndaloni dhe të hidhni një vështrim më të afërt në analizën e tij.

Gjëja e parë që bën skripti ynë është të përshkojë imazhin duke përdorur dy sythe "for". Në të njëjtën kohë, llogariten edhe koordinatat e secilit piksel të filigranit.

Më pas, informacioni RGB kërkohet për çdo piksel. Nëse pikeli aktual nuk është në zonën e kryqëzimit të imazhit origjinal dhe filigranit, atëherë klasa jonë kopjon vetëm pikselin për imazhin e ri. Nëse piksel ndodhet në zonën e kryqëzimit, duhet të përcaktojmë ngjyrën e tij si rezultat i mbivendosjes së imazhit origjinal dhe filigranit.

Për të përcaktuar ngjyrën e zonës së kryqëzimit, së pari duhet të marrim vlerën e ndryshores RGB të filigranit duke përdorur informacionin që kemi marrë në sythe "for". Më pas, duke përdorur funksionin "_get_ave_color", përcaktohet vlera mesatare e ngjyrës për imazhin e ri. Më pas vjen funksioni "_get_image_color" për të përcaktuar skemën e ngjyrave që do të përdoret nga funksioni "return_img".

Si rezultat, pas përfundimit të sytheve "për", ne kemi një imazh të përfunduar me një filigran.

Tani le të kontrollojmë klasën tonë në veprim.

Pjesa e katërt - test drive

Për të filluar, na duhen dy skedarë. Le ta quajmë të parën "watermark_test.php" dhe të vendosim kodin e mëposhtëm në të:



Qëllimi i këtij skedari është shumë i thjeshtë: ai shfaq imazhet origjinale (main.jpg) dhe ato që rezultojnë (watermark.png, me një filigran) në shfletues.

Siç mund ta shihni, imazhi ynë i dytë (watermark.png) i referohet skedarit php image.php, jo skedarit të imazhit. Kjo lidhje merr formën e një kërkese GET, ku vlerat e dy variablave transferohen në skedarin php: $main dhe $watermark.

Le ta quajmë skedarin e dytë "image.php" dhe të vendosim kodin e mëposhtëm në të:

krijimi_ujore($kryesore_img_obj, $ujore_img_obj, 66); # shfaq imazhin tonë që rezulton në shfletues - # por së pari bëjini të ditur se është një kokë skedari jpeg ("Lloji i përmbajtjes: imazh/jpeg"); header("Përmbajtja-Disposition: inline; emri i skedarit=" . $_GET["src"]); imagejpeg($return_img_obj, "", 50); ?>

Epo, kemi arritur në finale. (ZIP, 47,6 Kb)