/**
 * Создаёт уменьшенную копию изображения.
 * @param        $SrcFileName Исходный файл.
 * @param string $DstFileName Имя файла для сохранения уменьшенной копии.
 * @param int    $MaxWidth    Максимальная ширина уменьшенной копии.
 * @param int    $MaxHeight   Максимальная высота уменьшенной копии.
 * @param bool   $Stretch     Растягивать ли картинку если заданные размеры больше исходных.
 * @param null   $SaveFormat  Формат сохранения миниатюры (jpeg, png, gif, wbmp).
 * @return \TPicture
 */
function CreateThumb($SrcFileName, $DstFileName = '', $MaxWidth = 0, $MaxHeight = 0, $Stretch = false, $SaveFormat = null)
{
    $thumb = new TPicture($SrcFileName);
    if ($DstFileName == '') {
        return $thumb;
    } elseif (is_file($DstFileName)) {
        unlink($DstFileName);
    }
    if ($Stretch || ($MaxWidth > 0 || $MaxHeight > 0) && ($thumb->Width > $MaxWidth || $thumb->Height > $MaxHeight)) {
        $thumb->SetImageSize($MaxWidth, $MaxHeight);
    }
    $thumb->SaveToFile($DstFileName, $SaveFormat);
    return $thumb;
}
for ($i = 0; $i < $num_chars; ++$i) {
    $c = $code[$i];
    $x = $char_width * $c + $c + 1;
    $posx = rand($pole_wid * $i + 1, $pole_wid * $i + $pole_wid - $char_width - 1) + rand(-1, 1);
    if ($posx < 0) {
        $posx = 0;
    } elseif ($posx > $captcha->Width - $char_width) {
        $posx = $captcha->Width - $char_width;
    }
    $posy = rand(3, $captcha->Height - $char_height - 3);
    $captcha->Copy($font, $x, 1, 10, $char_height, $posx, $posy);
}
// Рисуем капчу
$result_image->Draw($captcha->gd, ($result_width - $captcha_width) / 2, 5);
// Искажение
$result_MultiWave = new TPicture();
$result_MultiWave->NewPicture($result_width, $captcha_height, IMAGE_PNG);
imagealphablending($result_MultiWave->gd, true);
imagecolortransparent($result_MultiWave->gd, 0xeeeeee);
imagefilledrectangle($result_MultiWave->gd, 0, 0, $result_width - 1, $captcha_height - 1, 0xeeeeee);
// случайные параметры (можно поэкспериментировать с коэффициентами):
// частоты
$rand1 = mt_rand(700000, 1000000) / 15000000;
$rand2 = mt_rand(700000, 1000000) / 15000000;
$rand3 = mt_rand(700000, 1000000) / 15000000;
$rand4 = mt_rand(700000, 1000000) / 15000000;
// фазы
$rand5 = mt_rand(0, 3141592) / 1000000;
$rand6 = mt_rand(0, 3141592) / 1000000;
$rand7 = mt_rand(0, 3141592) / 1000000;
$rand8 = mt_rand(0, 3141592) / 1000000;
function AdminGalleryImageRotate()
{
    global $GalleryDir, $ThumbsDir;
    $turn = $_GET['turn'];
    $id = SafeEnv($_GET['id'], 11, int);
    $angle = 0;
    if ($turn == 'left') {
        $angle = 90;
    } else {
        $angle = 270;
    }
    System::database()->Select('gallery', "`id`='{$id}'");
    $img = System::database()->FetchRow();
    $file_name = $img['file'];
    $file = $GalleryDir . $file_name;
    $thumb = $ThumbsDir . $file_name;
    // Поворачиваем изображение
    $pic = new TPicture($file);
    $pic->Rotate($angle);
    $pic->SaveToFile($file);
    // Обновляем эскиз
    if (is_file($thumb)) {
        unlink($thumb);
    }
    CreateThumb($file, $thumb, System::config('gallery/thumb_max_width'), System::config('gallery/thumb_max_height'));
    Audit('Фотогалерея: Поворот изображения ' . ($turn == 'left' ? 'влево' : 'вправо') . ' "' . $img['title'] . '" (id: ' . $img['id'] . ')');
    $back = new Url(GetRefererUrl($_REQUEST['back']));
    $back['update'] = SafeDB($_GET['id'], 11, int);
    // Добавляем / изменяем параметр update
    GO($back);
}
function AdminUserSaveAvatar()
{
    $alloy_mime = array('image/gif' => '.gif', 'image/jpeg' => '.jpg', 'image/pjpeg' => '.jpg', 'image/png' => '.png', 'image/x-png' => '.png');
    include_once System::config('inc_dir') . 'picture.class.php';
    $asize = getimagesize($_FILES['avatar']['tmp_name']);
    $alloy_mime = array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png');
    $alloy_exts = array('.gif', '.jpg', '.jpeg', '.png');
    if (in_array($_FILES['avatar']['type'], $alloy_mime) && in_array(strtolower(GetFileExt($_FILES['avatar']['name'])), $alloy_exts)) {
        $NewName = $_FILES['avatar']['name'];
        if ($asize[0] > System::config('user/max_avatar_width') || $asize[1] > System::config('user/max_avatar_height')) {
            $thumb = new TPicture($_FILES['avatar']['tmp_name']);
            $thumb->SetImageSize(System::config('user/max_avatar_width'), System::config('user/max_avatar_height'));
            $thumb->SaveToFile(System::config('general/avatars_dir') . $NewName);
        } else {
            copy($_FILES['avatar']['tmp_name'], System::config('general/avatars_dir') . $NewName);
        }
        Audit('Пользователи: Добавление аватара в галерею аватар "' . $NewName . '"');
    } else {
        System::admin()->AddCenterBox('Загрузка аватара');
        System::admin()->HighlightError('Неправильный формат аватара. Ваш аватар должен быть формата GIF, JPEG или PNG.<br /><a href="javascript:history.go(-1)">Назад в галерею</a>');
    }
    GO(ADMIN_FILE . '?exe=user&a=avatars');
}
 /**
  * Добавляет водяной знак на изображение
  * @param $place
  * @param int $transparency
  */
 public function AddWatermark($place, $transparency = 50)
 {
     $wm = new TPicture($this->WatermarkFile);
     if ($transparency > 100) {
         $transparency = 100;
     } elseif ($transparency < 1) {
         $transparency = 1;
     }
     switch ($place) {
         case 'center':
             ImageCopyMerge($this->gd, $wm->gd, ($this->Width - $wm->Width) / 2, ($this->Height - $wm->Height) / 2, 0, 0, $wm->Width, $wm->Height, $transparency);
             break;
         case 'top_left':
             ImageCopyMerge($this->gd, $wm->gd, 0, 0, 0, 0, $wm->Width, $wm->Height, $transparency);
             break;
         case 'top_right':
             ImageCopyMerge($this->gd, $wm->gd, $this->Width - $wm->Width, 0, 0, 0, $wm->Width, $wm->Height, $transparency);
             break;
         case 'down_right':
             ImageCopyMerge($this->gd, $wm->gd, $this->Width - $wm->Width, $this->Height - $wm->Height, 0, 0, $wm->Width, $wm->Height, $transparency);
             break;
         case 'down_left':
             ImageCopyMerge($this->gd, $wm->gd, 0, $this->Height - $wm->Height, 0, 0, $wm->Width, $wm->Height, $transparency);
             break;
     }
     $wm->Destruct();
 }