Работа с изображением в PHP

Контрольная работа, 04 Мая 2012, автор: пользователь скрыл имя

Описание работы


В области программирования для сети PHP — один из популярных скриптовых языков (наряду с JSP, Perl и языками, используемыми в ASP.NET) благодаря своей простоте, скорости выполнения, богатой функциональности. Популярность в области построения веб-сайтов определяется наличием большого набора встроенных средств для разработки веб-приложений. Основные из них: автоматическое извлечение POST и GET-параметров, а также переменных окружения веб-сервера в предопределённые массивы;

Работа содержит 1 файл

Работа с изображением в PHP.doc

— 1,022.00 Кб (Скачать)

Введение: 

    В области программирования для сети PHP — один из популярных скриптовых языков (наряду с JSP, Perl и языками, используемыми в ASP.NET) благодаря своей простоте, скорости выполнения, богатой функциональности.  Популярность в области построения веб-сайтов определяется наличием большого набора встроенных средств для разработки веб-приложений. Основные из них: автоматическое извлечение POST и GET-параметров, а также переменных окружения веб-сервера в предопределённые массивы;

    Взаимодействие с большим количеством различных систем управления базами данных (MySQL, MySQLi, SQLite, PostgreSQL,Oracle (OCI8), Oracle, Microsoft SQL Server, Sybase, ODBC, mSQL, IBM DB2, Cloudscape и Apache Derby, Informix, Ovrimos SQL,Lotus Notes, DB++, DBM, dBase, DBX, FrontBase, FilePro, Ingres II, SESAM, Firebird / InterBase, Paradox File Access, MaxDB,Интерфейс PDO.

   В настоящее время PHP используется сотнями тысяч разработчиков. Согласно рейтингу корпорации TIOBE, базирующемся на данных поисковых систем, в апреле 2011 года PHP находился на 5 месте среди языков программирования. К крупнейшим сайтам, использующим PHP, относятся Facebook, ВКонтакте, Wikipedia. 
 
 
 
 
 
 

1.Работа с изображением в PHP 

    В данном материале мы рассмотрим некоторые  примеры манипуляции с изображением при помощи библиотеки GD, а именно – операции с пикселями. Манипуляции с пикселом означают, что действие будет относиться только к нему не затрагивая все окружающие пиксели.

    Например, мы можем сделать негатив изображения. Для этого берем каждый пиксель  в изображении и заменяем его  противоположным цветом.

    Хорошо, но как это работает? Очень просто. Я беру картинку PNG, прохожу по каждому пикселю этого изображения и передаю его функции, которая принимает пиксель в качестве параметра. Функция возвращает мне новый пиксель. Я складываю все новые пиксели и получаю новое изображение. 
 

Класс для работы с пикселом

    Для начала нам понадобится класс для работы с пикселом. Он очень прост – содержит в себе три значения: красного, зеленого и синего.

 
 
<?php  
class Pixel {  
    function 
Pixel($r, $g, $b)  
    {  
        
$this->r = ($r > 255) ? 255 : (($r < 0) ? 0 : (int)($r));  
        
$this->g = ($g > 255) ? 255 : (($g < 0) ? 0 : (int)($g));  
        
$this->b = ($b > 255) ? 255 : (($b < 0) ? 0 : (int)($b));  
    }  
}  
?>

 
 
 
 
 

    Этот  класс имеет только одну функцию  – конструктор, которая сохраняет RGB значения пикселя.

    Чтобы создать красный пиксел, вы просто делаете:

<?php  
$red 
= new Pixel(255, 0, 0);  
?> 

 
 

Класс манипуляций с  пикселами: главный  метод

    Далее мы создаем класс, который проделывает  фактические действия с изображением. Назовем его Image_PixelOperations(). Все, что мне было нужно – это более простой метод для открытия PNG файлов, который бы проходил по каждому пикселу файла, вызывает функцию, получает новый пиксел и присваивает его новому изображению. Далее приведу текст метода:

 
 
<?php  
class Image_PixelOperations {  
          
    function 
pixelOperation(  
            
$input_image,  
            
$output_image,  
            
$operation_callback,  
            
$factor = false  
            
)  
    {  
          
        
$image = imagecreatefrompng($input_image);  
        
$x_dimension = imagesx($image);  
        
$y_dimension = imagesy($image);  
        
$new_image = imagecreatetruecolor($x_dimension, $y_dimension);  
          
        if (
$operation_callback == 'contrast') {  
            
$average_luminance = $this->getAverageLuminance($image);  
        } else {  
            
$average_luminance = false;  
        }  
          
        for (
$x = 0; $x < $x_dimension; $x++) {  
            for (
$y = 0; $y < $y_dimension; $y++) {  
          
                
$rgb = imagecolorat($image, $x, $y);  
                
$r = ($rgb >> 16) & 0xFF;  
                
$g = ($rgb >> 8) & 0xFF;  
                
$b = $rgb & 0xFF;  
          
                
$pixel = new Pixel($r, $g, $b);  
                
$pixel = call_user_func(  
                    
$operation_callback,  
                    
$pixel,  
                    
$factor,  
                    
$average_luminance  
                
);  
          
                
$color = imagecolorallocate(  
                    
$image,  
                    
$pixel->r,  
                    
$pixel->g,  
                    
$pixel->b  
                
);  
                
imagesetpixel($new_image, $x, $y, $color);  
            }  
          
        }  
          
        
imagepng($new_image, $output_image);  
    }  
}  
          
?>

    Метод принимает путь до файла. Никаких  проверок не производит, предполагая, что это правильный PNG файл. Второй параметр – это имя нового файла изображения. Третий – функция, которая будет вызываться для каждого пикселя. И последний параметр – это любой дополнительный параметр, который мы хотели бы передать в вызываемую для пиксела функцию. 

Добавляем шумов

    И так, пришло время, чтобы написать первую функцию обработки пиксела: addNoise(). Добавление шума к изображению означает добавление случайного значения к каждому каналу пикселя.  Что такое канал – уровень красного цвета в пикселе = канал, Тоже самое с зеленым и синим. Далее привожу функцию:

 
 
<?php  
    
function addNoise($pixel, $factor)  
    {  
        
$random = mt_rand(-$factor, $factor);  
        return new 
Pixel(  
                    
$pixel->r + $random,  
                    
$pixel->g + $random,  
                    
$pixel->b + $random  
                
);  
    }  
?> 

 

    Что представляет из себя функция? Она получает случайное число в указанном  пользователем диапазоне ($factor). И добавляет его к значению каналов пиксела. Пользователь указывает диапазон уровня шума: 0 – нет шума, 255 – очень много шума. 

<form method="get">  
    <input name="image" />  
    <input type="submit" />  
</form> 

 

    Она принимает параметр – названия файла с изображением. После получения этого параметра я создаю новый объект класса для работы с пикселами:

 
 
 
 
<?php  
if (!empty($_GET['image'])) {  
          
    
$po =& new Image_PixelOperations();  
          
}  
?> 

 
 
 

    Далее я показываю оригинальное изображение, а затем результат обработки.

 
 
 
 
<?php  
    
echo 'Оригинал: <br /><img src="'. $_GET['image'] .'" />';  
    echo 
'<hr />';  
          
    
// Шумы  
    
$noise = 100;  
    
$po->pixelOperation($_GET['image'], 'result_noise.png', array($po, 'addNoise'), $noise);  
    echo 
'<br />Добаляем шумы (factor '. $noise .'): <br /><img src="result_noise.png" />';  
    echo 
'<hr />';  
          
?> 

Информация о работе Работа с изображением в PHP