За последние 24 часа нас посетили 17874 программиста и 1603 робота. Сейчас ищут 1788 программистов ...

Водяной знак

Тема в разделе "Обработка изображений средствами PHP", создана пользователем rustoke, 23 янв 2015.

  1. rustoke

    rustoke Новичок

    С нами с:
    20 сен 2014
    Сообщения:
    145
    Симпатии:
    0
    Накладываю водяной знак (PNG) на GIF, получается черный фон вместо прозрачности. Как убрать черный фон?
    Код (Text):
    1.  
    2. <?
    3. //имя файла
    4. $f_name = time();
    5. //папка
    6. $path_directory = 'avatars/';
    7. //проверка формата исходного изображения
    8. if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['imgupload']['name'])){    
    9.         $fil = $_FILES['imgupload']['name'];
    10.         //расширение файла
    11.         $filename = $f_name.".".substr($fil, strrpos($fil, '.') + 1);
    12.         $source = $_FILES['imgupload']['tmp_name'];
    13.         $target = $path_directory . $filename;
    14.         move_uploaded_file($source, $target);
    15.         //загрузка оригинала в папку $path_directory      
    16.     if(preg_match('/[.](GIF)|(gif)$/', $filename)) {
    17.     $im = imagecreatefromgif($path_directory.$filename) ;
    18.     //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия
    19.     }
    20.     if(preg_match('/[.](PNG)|(png)$/', $filename)) {
    21.     $im = imagecreatefrompng($path_directory.$filename) ;
    22.     //если оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия
    23.     }  
    24.     if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {
    25.     $im = imagecreatefromjpeg($path_directory.$filename);
    26.     //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия
    27.     }
    28.  
    29.  
    30.  
    31.  
    32.  
    33.  
    34.  
    35. //Создаем ВОДЯНОЙ ЗНАК - - - - - - - - - - - -
    36. //ЕСЛИ НЕ НУЖЕН ВОДЯНОЙ ЗНАК - УДАЛИТЬ ЭТОТ БЛОК!
    37.  
    38. //если ширина оригинального изображения больше 300 пикселей, ставим водяной знак
    39. if(imagesx($im) >= 300){
    40.  
    41. $stamp = imagecreatefrompng('watermark.png');
    42. // Установка полей для штампа и получение высоты/ширины штампа
    43. $marge_right = 10;
    44. $marge_bottom = 10;
    45. $sx = imagesx($stamp);
    46. $sy = imagesy($stamp);
    47. // Копирование изображения штампа на фотографию с помощью смещения края
    48. // и ширины фотографии для расчета позиционирования штампа.
    49. imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, $sx, $sy);
    50. imagejpeg($im, $path_directory.$f_name.".jpg");  
    51.  
    52.  
    53. //здесь конвертируем gif, png  в jpg и удаляем оригиналы
    54. if(preg_match('/[.](GIF)|(gif)|(PNG)|(png)$/', $filename)) {
    55. imagejpeg($im, $path_directory.$f_name.".jpg");
    56. unlink($target);
    57. }  
    58.  
    59. }//if
    60.  
    61.  
    62.  
    63.  
    64. //Конец кода ВОДЯНОЙ ЗНАК - - - - - - - - - - - -
    65.  
    66.  
    67.  
    68.  
    69.  
    70.  
    71.  
    72.  
    73.  
    74.  
    75.  
    76.  
    77.  
    78. // МИНИАТЮРА
    79. // dest - результирующее изображение
    80. // w - ширина изображения
    81. // ratio - коэффициент пропорциональности
    82. $w = 250;
    83. $w_src = imagesx($im); //вычисляем ширину
    84. $h_src = imagesy($im); //вычисляем высоту
    85. $ratio = $w_src/$w;
    86. $w_dest = round($w_src/$ratio);
    87. $h_dest = round($h_src/$ratio);
    88. $dest = imagecreatetruecolor($w_dest,$h_dest); // важно именно truecolor!, иначе будем иметь 8-битный результат
    89. imagecopyresampled($dest, $im, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
    90.  
    91. //создаем миниатюру
    92. imagejpeg($dest, $path_directory.$f_name."_small.jpg");
    93. $avatar = $path_directory.$f_name."_small.jpg";
    94.  
    95.  
    96. }else{
    97. //в случае несоответствия формата, выдаем соответствующее сообщение
    98. exit ("Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>"); //останавливаем выполнение сценариев
    99. }
    100.  
    101.  
    102.  
    103.  
    104.  
    105.  
    106. echo "<img width='500' src='avatars/".$f_name.".jpg' />";
    107. echo "<br/>";
    108. echo "<img src='avatars/".$f_name."_small.jpg' />";
    109. ?>
    110. <br />
    111. <a href="index.php">назад</a>
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    включить альфа-канал
     
  3. rustoke

    rustoke Новичок

    С нами с:
    20 сен 2014
    Сообщения:
    145
    Симпатии:
    0
    пробовал сделать так:

    Код (Text):
    1.  
    2. imagecolortransparent($im, imagecolorallocatealpha($im, 0, 0, 0, 127));
    3.     imagealphablending($im, false);
    4.     imagesavealpha($im, true);
    не получилось
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а почему альфаблендинг ВЫКЛЮЧЕН? повнимательнее почитай мануал по GD. и погугли готовые решения.
     
  5. rustoke

    rustoke Новичок

    С нами с:
    20 сен 2014
    Сообщения:
    145
    Симпатии:
    0
    со включенным тоже не работает, может я что то не так делаю, покажите куда надо вставлять код?
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    поищи в гугле. сорри, но я уже лет 8 как ушел от GD в пользу более качественных изображений и более широкого функционала. но то что ватермарк накладывается в пару простых решений - это точно. я конечно могу поднять древние проекты, но ты быстрее нагуглишь.