Показать сообщение отдельно

  #3  
Старый 05.10.2009, 10:00
[aCR]RASSVET
Новичок
Регистрация: 27.04.2008
Сообщений: 15
Провел на форуме:
154305

Репутация: 6
По умолчанию

2 PHP-функции для работы с изображениями.
Представляю вашему вниманию 2 полезных PHP-функции для работы с картинками.
Одна из них позволяет пропорционально уменьшать размеры картинки, вторая - проверять картинку на валидность (защита от XSS-атак).

Пропорциональное уменьшение размеров изображения:
PHP код:
<?php

/** Универсальный ресайз картинок
  *
  * Функция позволяет копировать изображение,
  * оставляя его исходные характеристики или
  * изменяя его размер и/или качество.
  * При изменении размера сохраняются пропорции.
  *
  * Функция умеет работать с изображениями
  * следующих форматов: JPG, PNG, GIF.
  *
  * Параметры:
  * @ $from        - путь к изображению, над которым будут выполняться операции
  * @ $to        - путь к результирующему изображению
  * @ $maxwidth    - максимальная ширина изображения
  * @ $maxheight    - максимальная высота изображения
  * @ $quality    - качество картинки (0..100) (для JPG и PNG)
  *
  * Возвращаемые значения:
  * false    - во время выполнения произошла ошибка
  * true    - функция выполнилась успешно и без ошибок
  *
  * Автор:
  * @name    Валерий 'Figaroo' Киркиж
  * @url    http://figaroo.ru/
  * @email    mail@figaroo.ru
*/
function figaroo_resize_image ($from$to$maxwidth$maxheight$quality 80) {
        
// защита от Null-байт уязвимости PHP
        
$from preg_replace('/\0/uis'''$from);
        
$to preg_replace('/\0/uis'''$to);

        
// информация об изображении
        
$imageinfo = @getimagesize($from);
        
// если получить информацию не удалось - ошибка
        
if (!$imageinfo) return false;
        
// получаем параметры изображения
        
$width $imageinfo[0];        // ширина
        
$height $imageinfo[1];    // высота
        
$format $imageinfo[2];    // ID формата (число)
        
$mime $imageinfo['mime'];    // mime-тип

        // определяем формат и создаём изображения
        
switch ($format) {
            case 
2$img imagecreatefromjpeg($from); break;    // jpg
            
case 3$img imagecreatefrompng($from); break;    // png
            
case 1$img imagecreatefromgif($from); break;    // gif
            
default: return false; break;
        }
        
// если создать изображение не удалось - ошибка
        
if (!$img) return false;

        
// меняем размеры изображения
        
$newwidth $newheight 0;
        
// требуется квадратная картинка
        
if ($maxwidth == $maxheight) {
            
// размеры картинки больше по X и по Y
            
if ($width $maxwidth && $height $maxheight) {
                
// пропорции картинки одинаковы
                
if ($width == $height) {
                    
$newwidth $maxwidth;
                    
$newheight $maxheight;
                }
                
// ширина больше
                
elseif ($width $height) {
                    
$newwidth $maxwidth;
                    
$newheight intval(((float)$newwidth / (float)$width) * $height);
                }
                
// высота больше
                
else {
                    
$newheight $maxheight;
                    
$newwidth intval(((float)$newheight / (float)$height) * $width);
                }
            }
            
// размеры картинки больше только по X
            
elseif ($width $maxwidth) {
                
$newwidth $maxwidth;
                
$newheight intval(((float)$newwidth / (float)$width) * $height);
            }
            
// размеры картинки больше только по Y
            
elseif ($height $maxheight) {
                
$newheight $maxheight;
                
$newwidth intval(((float)$newheight / (float)$height) * $width);
            }
            
// в остальных случаях ничего менять не надо
            
else {
                
$newwidth $width;
                
$newheight $height;
            }
        }
        
// требуется горизонтальная картинка
        
elseif ($maxwidth $maxheight) {
            
// размеры картинки больше по X и по Y
            
if ($width $maxwidth && $height $maxheight) {
                
// ширина больше
                
if ($width $height) {
                    
$newwidth $maxwidth;
                    
$newheight intval(((float)$newwidth / (float)$width) * $height);
                }
                
// высота больше или равна ширине
                
else {
                    
$newheight $maxheight;
                    
$newwidth intval(((float)$newheight / (float)$height) * $width);
                }
            }
            
// размеры картинки больше только по X
            
elseif ($width $maxwidth) {
                
$newwidth $maxwidth;
                
$newheight intval(((float)$newwidth / (float)$width) * $height);
            }
            
// размеры картинки больше только по Y
            
elseif ($height $maxheight) {
                
$newheight $maxheight;
                
$newwidth intval(((float)$newheight / (float)$height) * $width);
            }
            
// в остальных случаях ничего менять не надо
            
else {
                
$newwidth $width;
                
$newheight $height;
            }
        }
        
// требуется вертикальная картинка
        
elseif ($maxwidth $maxheight) {
            
// размеры картинки больше по X и по Y
            
if ($width $maxwidth && $height $maxheight) {
                
// ширина больше или равна высоте
                
if ($width >= $height) {
                    
$newwidth $maxwidth;
                    
$newheight intval(((float)$newwidth / (float)$width) * $height);
                }
                
// высота больше
                
else {
                    
$newheight $maxheight;
                    
$newwidth intval(((float)$newheight / (float)$height) * $width);
                }
            }
            
// размеры картинки больше только по X
            
elseif ($width $maxwidth) {
                
$newwidth $maxwidth;
                
$newheight intval(((float)$newwidth / (float)$width) * $height);
            }
            
// размеры картинки больше только по Y
            
elseif ($height $maxheight) {
                
$newheight $maxheight;
                
$newwidth intval(((float)$newheight / (float)$height) * $width);
            }
            
// в остальных случаях ничего менять не надо
            
else {
                
$newwidth $width;
                
$newheight $height;
            }
        }

        
// если изменений над картинкой производить не надо - просто копируем её
        
if ($newwidth == $width && $newheight == $height && $quality == 80) {
            if (
copy($from$to)) return true;
            else return 
false;
        }

        
// создаём новое изображение
        
$new imagecreatetruecolor($newwidth$newheight);
        
$black imagecolorallocate($new000);
        
$white imagecolorallocate($new255255255);
        
// копируем старое в новое с учётом новых размеров
        
imagefilledrectangle($new00$newwidth 1$newheight 1$white);
        
//imagecolortransparent($new, $white);
        
imagecopyresampled($new$img0000$newwidth$newheight$width$height);
        
// создаём файл с новым изображением
        
switch ($format) {
            case 
2// jpg
                
if ($quality 0$quality 0;
                if (
$quality 100$quality 100;
                
imagejpeg($new$to$quality);
            break;
            case 
3// png
                
$quality intval($quality 100);
                if (
$quality 0$quality 0;
                if (
$quality 9$quality 9;
                
imagepng($new$to$quality);
            break;
            case 
1// gif
                
imagegif($new$to);
            break;
        }
        return 
true;
}

?>
Проверка на валидность:
PHP код:
<?php

// функция проверки изображения на валидность (защита от XSS-атак)
function verify_image ($file) {
    
// защита от Null-байт уязвимости PHP
    
$file preg_replace('/\0/uis'''$file);
    
// проверка изображения
    
$txt file_get_contents($file);
    if (
preg_match('#&(quot|lt|gt|nbsp|amp);#i'$txt)) return false;
    elseif (
preg_match("#&\#x([0-9a-f]+);#i"$txt)) return false;
    elseif (
preg_match('#&\#([0-9]+);#i'$txt)) return false;
    elseif (
preg_match("#([a-z]*)=([\`\'\"]*)script:#iU"$txt)) return false;
    elseif (
preg_match("#([a-z]*)=([\`\'\"]*)javascript:#iU"$txt)) return false;
    elseif (
preg_match("#([a-z]*)=([\'\"]*)vbscript:#iU"$txt)) return false;
    elseif (
preg_match("#(<[^>]+)style=([\`\'\"]*).*expression\([^>]*>#iU"$txt)) return false;
    elseif (
preg_match("#(<[^>]+)style=([\`\'\"]*).*behaviour\([^>]*>#iU"$txt)) return false;
    elseif (
preg_match("#</*(applet|link|style|script|iframe|frame|frameset)[^>]*>#i"$txt)) return false;
    return 
true;
}

?>
 
Ответить с цитированием