|
В този урок ще покажа как да затрудняваме изпращането на формуляри от автоматизирани инструменти. Стъпките на този основен скрипт включват създаване на пространство за чертане, определяне на цветоте, запълване на фона, изчертаване на знаковете, прилагане на знаковете, прилагане на изкривявания и изпращане на изображението към браузъра:
CODE
В горния код задаваме хоризонталните и вертикалните размери на изображенията в променливи, така че бъдещите промени да са по-лесни. След това взимаме кода от GET параметара code и го отрязваме най-много до осем знака. Накрая изчисляваме $space_per_char - разтоянието между буквите, което ще се използва при последвалото рендиране по-късно в скрипта. ЗАБЕЛЕЖКА: Естествено, използването на $_GET параметрите за взимането на кода обезмисля целия скрипт, тъй като всеки робот може просто да прочете HTML файла, съдържащ реда <img src='image.php?code=foobar'/>. За да работи правилно тази концепция, кодът трябва да се съхранява в база данни и скриптът за генерирането на изображението да го прочита например чрез случайно генериран ключ. Това би изглеждало горе доло така: CODE
и да бъде вградено в HTML страницата чрез: CODE
CODE
Чрез imagecreatetruecolor(), създаваме ново "платно" за рисуване с 256 различни нюанса на червеното, зеленото и синиото, както и отделен алфа канал за всеки пиксел. PHP предоставя и друк вариант на imagecreate, който се използва за създаване на изображения с фиксирана палитра, с най много 256 цвята, но imagecreatetruecolor() се използва по-често, тъй като генерираните от нея изображения обикновено изглеждат по добре. JPEG и PNG файловете поддържат изображения с true color (24 битов цвят), така че за нашия PNG фаил ще използваме тази функция. Фонът по подразбиране е черен тъй като искаме да променим фона, ще трябва да "заделим" някои цветове ето така: CODE
В горния код използваме imagecolorallocate() за дефиниране на пет различни цвята - $background, $border и $colors, което е масив от три различни цвята за рендирането на текста. При всяко извикване на функцията подаваме променливата $img (ресурсът на изображението, връщан от функцията imagecreatetruecolors() по-горе в скрипта ), следвана от три параметара, определящи стойностите за цвета. Първият от тези параметри определя количеството червено в цвета, вторият определя стойстта на синия канал, а третият показва количеството зелено. Стойностите на трите основни цвята варират от 0 до 255. Бяло например се задава чрез 255, 255, 255 ,а черното е 0, 0, 0. В нашия скрипт, $backgraund e бял, а $border се дефинира с 50-процентови стойности, което е сиво. Ако желаете можете да си добавите още цветове. CODE
Посредством тези тези две функции променяме цвета на фона на бял и добавяме сивата рамка. И двете функции приемат едни и същи параметри: ресурса на изображението, координатите на горния ляв ъгъл, координатите на долен десен ъгъл и цвета. Координатите варират от 0, 0 до size_x - 1, size_y - 1, т.е. очертаваме запълнен правоъгълник от позиция 1, 1 до size_x - 2, size_y - 2. Освен това изчертаваме и сива рамка по края на изображението. CODE
В този код обхождаме в цикал всички знакове на нашия кодов низ. Първо взимаме следващия елемент от масива с цветовете. Използваме оператора модул (%), за да сме сигурни, че в масива има елемент с такъв ключ. След това използваме функцията imagettftext(), за да изчертаем буквата. CODE
Този ред активира изграждането на линии (anti-aliasing). Изграждането на линии е техника за създаване на по гладки линии. CODE
Изчертаваме 1000 малки линии с произволни координати за начало край. Функцията imageline() е със следните параметри: ресурс на изображението, начални x и y координати, крайни x и y координати, цвета, с който да се изчертае линията. CODE
В края на нашия скрипт използваме фунцията header(), за да наредим на браузара да очаква данни, представляващи image/png. Този mime тип се асоциира от браузара с PNG изображение, така че той знае как да обработи правилно данните. Различните типове данни са с различни mime типове. За изображенията, може да се задава image/gif (за GIF изображения), image/jpeg (за JPEG изображения), application/octet-stream (за двоични данни) и други mime типове. Чрес HTTP хедара Content-type казваме на браузара какво да очаква. Функцията header() може да се използва, само ако не е изпратено никакво съдържание преди самия хедър. Това означава никакви интервали, никакви HTML тагове, абсолютно нищо. Ако преди конструкцията header се изпрати някакво съдържание, ще получите предобреждение подобно на: Warning: Cannot modify header information - header already send by (output started at /usr/book/gd/antibot.php:2) in /usr/book/gd/antibot.php on line 53 Накрая извикваме функцията imagepng(), която за първи параметър приема ресурса на изображението. Вторият и параметър не е задължителен: име на файла в който да се съхранява изображението. Ако няма втори параметър функцията "отпечатва" всички данни за изображението в браузара.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









