Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Niechciana kompresja po wgraniu na serwer
Forum PHP.pl > Forum > PHP
d12
Witam,

Mam problem z (autorskim) skryptem tapet. Mianowice po wgraniu na serwer fotka jest poddawana kompresji. Przykładowo fotka zajmowałą 472 KB,a jak wgrałem przez skrypt na serwer zajmuje 71,5 KB (znaczne pogorszenie jakości).

Poniżej prezentuję plik addphoto.php:

  1. <?php
  2.  
  3. if(!defined('SFG')) return;
  4.  
  5. echo 'Dodaj obrazek - ';
  6.  
  7. /*  */
  8.  
  9. // koncowa akcja, upload zdjecia, utworzenie miniatury jesli trzeba, utworzenie no
  10. ej grupy lub/i wpis do tabeli obrazow
  11. if(isset($_POST['cid']) && (isset($_POST['gid']) || isset($_POST['gdesc']))) {
  12. echo 'zapis obrazka (3/3).<br /><br />';
  13.  
  14.     switch($_FILES['plik']['error']) {
  15.         case 0:
  16.             //echo 'Plik został poprawnie wczytany..<br />';
  17.             break;
  18.         case 1:
  19.             err('Rozmiar pliku przekracza wartość maksymalną wksazaną przez php.ini.');
  20.             break;
  21.         case 2:
  22.             err('Rozmiar pliku przekracza wartość maksymalną wksazaną przez MAX_FILE_SIZE.');
  23.             break;
  24.         case 3:
  25.             err('Została wysłana tylko część pliku.');
  26.             break;
  27.         case 4:
  28.             err('Żaden plik nie został wysłany.');
  29.             break;
  30.     }
  31.  
  32.     switch($_FILES['plik']['type']) {
  33.         case 'image/jpeg':
  34.         case 'image/pjpeg':
  35.             $imgType = 'jpg';
  36.             break;
  37.         case 'image/png':
  38.         case 'image/x-png':        
  39.             $imgType = 'png';
  40.             break;
  41.         default:
  42.             err('Można wysyłać tylko pliki typu jpg i png. ('.$_FILES['plik']['type'].')');
  43.     }
  44.  
  45.     if(is_uploaded_file($_FILES['plik']['tmp_name'])) {
  46.         // nalezy utworzyc nazwe dla obrazka, bedzie to ostatni numer pid powiekszony o je
  47. en + rozszezenie
  48.         $sql = &#092;"SELECT MAX(pid) FROM sfg_pictures\";
  49.         $result = $q->query($db, $sql);
  50.         if($q->error()) {
  51.          err('Query.', __LINE__);
  52.         }
  53.         list($newpid) = $q->getrow($result);
  54.         ++$newpid;
  55.  
  56.         if(move_uploaded_file($_FILES['plik']['tmp_name'], $SFG['picturedir'].$newpid.'.'.$imgType)) {
  57.             // tworzymy obrazek by pobrac jego rozmiary, a takze jesli trzeba to do stworzenia
  58. miniatury
  59.             switch($imgType) {
  60.                 case 'jpg':
  61.                     $img = imagecreatefromjpeg($SFG['picturedir'].$newpid.'.'.$imgType);
  62.                     break;
  63.                 case 'png':
  64.                     $img = imagecreatefrompng($SFG['picturedir'].$newpid.'.'.$imgType);
  65.                     break;
  66.             }
  67.             
  68.             $imgW = imagesx($img); // szerokosc
  69.             $imgH = imagesy($img); // wysokosc
  70.  
  71.    // jest okreslony gdesc, nie ma gid, czyli tworzymy nowa grupe, a takze miniature 
  72. o tej grupy
  73.             if(isset($_POST['gdesc']) && !isset($_POST['gid'])) {
  74.              // jesli puste pole gdesc to gdesc otrzyma wpis o wartosci domyslnej ustalonwej pr
  75. ez tabele sfg_groups
  76.              if(empty($_POST['gdesc'])) {
  77.                     $sql = sprintf(&#092;"INSERT INTO sfg_groups (gcid, guid, gtype) VALUES (%d, %d, '%s')\",
  78.                      $_POST['cid'], $_SESSION['uid'], $imgType); 
  79.                 }
  80.                 else {
  81.                  $sql = sprintf(&#092;"INSERT INTO sfg_groups (gcid, guid, gtype, gdesc) VALUES (%d, %d, '%s', '%s')\",
  82.                   $_POST['cid'], $_SESSION['uid'], $imgType, $_POST['gdesc']);
  83.                 }
  84.                 $q->query($db, $sql);
  85.                 if($q->error()) {
  86.            err('Query.', __LINE__);
  87.           }
  88.           
  89.           $sql = &#092;"SELECT MAX(gid) FROM sfg_groups\";
  90.                 $result = $q->query($db, $sql);
  91.                 if($q->error()) {
  92.            err('Query.', __LINE__);
  93.           }          
  94.     list($newgid) = $q->getrow($result);
  95.                  
  96.              // tworzymy miniature, miniatura ma nazwe zlozona z numeru grupy (gid) + rozszezenia
  97.                 $imgMiniature = imagecreatetruecolor($SFG['minipictureW'], $SFG['minipictureH']);
  98.                 imagecopyresampled($imgMiniature, $img, 0, 0, 0, 0, $SFG['minipictureW'], $SFG['minipictureH'], $imgW, $imgH);
  99.  
  100.                 // zapisujemy miniature do pliku
  101.                 switch($imgType) {
  102.                     case 'jpg':
  103.                         imagejpeg($imgMiniature, $SFG['minipicturedir'].$newgid.'.'.$imgType);
  104.                         break;
  105.                     case 'png':
  106.                         imagepng($imgMiniature, $SFG['minipicturedir'].$newgid.'.'.$imgType);
  107.                         break;
  108.                 }
  109.                 imagedestroy($imgMiniature);
  110.             }
  111.             
  112.             // przygotowania do stworzenia znaku wodnego
  113.             $imgWM = imagecreatefromgif($SFG['watermark']);
  114.             $imgWMW = imagesx($imgWM);
  115.             $imgWMH = imagesy($imgWM);
  116.             
  117.    // utworz znak wodny w prawym dolnym rogu, magines 5 pikseli
  118.             imagecopymerge($img, $imgWM, ($imgW - $imgWMW - 5), ($imgH - $imgWMH - 5), 0, 0, $imgWMW, $imgWMH, 40);
  119.             
  120.    // zapisz zmiany
  121.             switch($imgType) {
  122.             case 'jpg':
  123.                 imagejpeg($img, $SFG['picturedir'].$newpid.'.'.$imgType);
  124.                 break;
  125.             case 'png':
  126.                 imagepng($img, $SFG['picturedir'].$newpid.'.'.$imgType);
  127.                 break;
  128.             }
  129.             imagedestroy($img);
  130.  
  131.             // ... gid gid gid
  132.             if(isset($_POST['gdesc']) && !isset($_POST['gid'])) {
  133.              $pgid = $newgid;
  134.             }
  135.             else {
  136.              $pgid = $_POST['gid'];
  137.             }
  138.  
  139.             // zapisujemy dane o nowym obrazku
  140.             $sql = &#092;"INSERT INTO sfg_pictures (pgid, psizex, psizey) VALUES ($pgid, $imgW, $imgH)\";
  141.             $q->query($db, $sql);
  142.             if($q->error()) {
  143.           err('Query.', __LINE__);
  144.       }
  145.  
  146.             echo 'Dodano, albo i nie.';
  147.         }
  148.         else {
  149.             err('Plik nie może być skopiowany do wybranego katalogu.');
  150.         }
  151.     }
  152.     else {
  153.         err('Możliwy atak podczas wysyłania pliku (LUL).');
  154.     }
  155. }
  156. // akcja srodkowa, wybieramy obrazek do uploadu oraz opis lub grupe obrazkowa
  157. elseif(isset($_POST['cid']) && isset($_POST['addgid'])) {
  158. echo 'wybór obrazka (2/3).<br /><br />';
  159.     echo '<form enctype=\"multipart/form-data\" action=\"'.$_SERVER['PHP_SELF'].'?p=addphoto\" method=\"post\">';
  160.  
  161.     // nowy obrazek
  162.     if($_POST['addgid']) {
  163.             echo '<input type=\"text\" name=\"gdesc\" value=\"\" /> Opis co przedstawia obrazek<br /><br />';
  164.     }
  165.     // nowa rozdzielczosc
  166.     else {
  167.         $sql = sprintf(&#092;"SELECT DISTINCT gid, gdesc FROM sfg_categories, sfg_groups WHERE gcid = %d AND guid = %d\",
  168.          $_POST['cid'], $_SESSION['uid']);
  169.         $result = $q->query($db, $sql);
  170.         if($q->error()) {
  171.          err('Query.', __LINE__);
  172.         }
  173.  
  174.         echo '<select name=\"gid\">';
  175.  
  176.         while(list($gid, $gdesc) = $q->getrow($result)) {
  177.             echo '<option value=\"'.$gid.'\">'.$gdesc.'</option>';
  178.         }
  179.         echo '</select> Do której grupy nowa rozdzielczość<br /><br />';
  180.     }
  181.     echo '<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"1048576\" />';
  182.     echo '<input name=\"plik\" type=\"file\" /> Wybierz nowe zdjęcie<br /><br />';
  183.     echo '<input type=\"hidden\" name=\"cid\" value=\"'.$_POST['cid'].'\" />';
  184.     echo '<input type=\"submit\" value=\"Wyślij\" />';
  185.     echo '</form>';
  186. }
  187. // pierwsza akcja, umozliwia wybranie kategorii oraz czy bedziemy dodawac nowa roz
  188. zielczosc, albo calkiem nowy obrazek
  189. else {
  190. echo 'wybór kategorii (1/3).<br /><br />';
  191.  
  192.     $sql = &#092;"SELECT cid, cname FROM sfg_categories\";
  193.     $result = $q->query($db, $sql);
  194.     if($q->error()) {
  195.         err('Query.', __LINE__);
  196.     }
  197.  
  198.     echo '<form action=\"'.$_SERVER['PHP_SELF'].'?p=addphoto\" method=\"post\">';
  199.     echo '<select name=\"cid\">';
  200.     
  201.     while(list($cid, $cname) = $q->getrow($result)) {
  202.         echo '<option value=\"'.$cid.'\">'.$cname.'</option>';
  203.     }
  204.     echo '</select> Kategoria<br /><br />';
  205.     // przy calkiem nowym obrazku nalezy dodac nowa grupe (gid)    
  206.     echo '<input type=\"radio\" name=\"addgid\" value=\"1\" checked=\"checked\" /> Całkiem nowy obrazek<br />';
  207.     echo '<input type=\"radio\" name=\"addgid\" value=\"0\" /> Nowa rozdzielczość do obrazka<br /><br />';
  208.     echo '<input type=\"submit\" value=\"Dalej\" />';
  209.     echo '</form>';
  210. }
  211.  
  212. ?>
crash

Zapoznaj się z funkcją imagejpeg" title="Zobacz w manualu PHP" target="_manual. Nie podałeś parametru jakość i została przyjęta domyślna wartość 75.
d12
A czy mógłbyś mi dołożyć ten tag, do addphoto.php, ponieważ ja nie potrafię?
crash
O tagu było odnośnie forum. To już poprawiłem sam. Ty masz poczytać na temat funkcji imagejpeg() w manualu i wprowadzić ewentualną zmianę w swoim kodzie w linii 134 na tym listingu.
tiraeth
do funkcji imagejpeg dodaj trzeci parametr, w którym wpiszesz procent jakości tworzonego JPGa. Domyślnie jest 75 a jak ustawisz na 100, jakość niepogorszy się.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.