Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] [gd] Dwa problemy z PNG
Forum PHP.pl > Forum > Przedszkole
charlie-cherry
Problem pierwszy:

Mam taki kod:

Kod
if (is_uploaded_file($_FILES['plik']['tmp_name'])) {
  if ($_FILES['plik']['size'] > $max_rozmiar) {echo 'Błąd! Plik jest za duży!'; }
  }

  if ($_FILES['plik']['type'] == 'image/jpeg' or $_FILES['plik']['type'] == 'image/jpg' or $_FILES['plik']['type'] == 'image/png'
or $_FILES['plik']['type'] == 'image/gif') {echo 'Odebrano plik ! <br>';
  
$plik_tmp = $_FILES['plik']['tmp_name'];
$plik_nazwa = $_FILES['plik']['name'];
$plik_rozmiar = $_FILES['plik']['size'];

if(is_uploaded_file($plik_tmp)) {
     move_uploaded_file($plik_tmp, "mapy/$plik_nazwa");
    echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze
    <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
    
    $ImgSize = getimagesize("mapy/$plik_nazwa");
   $a = $ImgSize[1];
    $b = $ImgSize[0];
    $c = $ImgSize[2];
    
    $plik_nazwa2 = "m_".$plik_nazwa;
      echo $a.$b;
      echo '<br>'.$c;
           if ($b>=380) {$x=380;
          $czynnik = $b/$x;
          $y = $a/$czynnik;}
          elseif ($b<380 AND $a>400)
          {$y=400;
          $czynnik = $a/$y;
          $x = $b/$czynnik;}
          else {$x = $b; $y = $a;}
                    
          ceil ($x);
          ceil ($y);
          
          switch ($c) {            
      case '1': $SrcImg = imagecreatefromgif("mapy/$plik_nazwa");
    $thumb = imagecreatetruecolor($x,$y);
    imagecopyresampled($thumb,$SrcImg,0,0,0,0,$x,$y,$b,$a);
         imagegif($thumb, "mapy/$plik_nazwa2");
         break;
          case '2':          
      $SrcImg = imagecreatefromjpeg("mapy/$plik_nazwa");
    $thumb = imagecreatetruecolor($x,$y);
    imagecopyresampled($thumb,$SrcImg,0,0,0,0,$x,$y,$b,$a);
         imagejpeg($thumb, "mapy/$plik_nazwa2");
         break;
        case '3':    
      $SrcImg = imagecreatefrompng ("mapy/$plik_nazwa");
    $thumb = imagecreatetruecolor($x,$y);
    imagecopyresampled($thumb,$SrcImg,0,0,0,0,$x,$y,$b,$a);
         imagepng($thumb, "mapy/$plik_nazwa2");
         break;}
     }
         }
        
    else { echo "zły rodzaj pliku";}


Służy mi on do uploadu plików i wykonywania miniaturek (obiera plik z panel. Wszystko działa ok, ale problem zaczyna się przy próbie przesłania dużego PNG (2886x1288, 159 kb) - wyskakuje błąd "Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 3717168 bytes)". OK, myślę sobie, limit_memory na 8M, na Apache nie wystarcza. Ale czemu ta sama grafika w GIFIE (te same wymiary, większy "ciężar") da się załadować?

Problem z PNG numer 2:

Używając powyższego skryptu otrzymuję piękną miniaturkę PNG (w przypadku PNG), która niekiedy zajmuje więcej miejsca na dysku (w kb) niż dużo większy oryginał (większy w znaczeniu wyższy i szerszy). Nie za bardzo rozumiem - czy PNG sprawdza się tylko w przypadku naprawdę dużych plików graficznych?

Poza tym próbowałem (co najbardziej mnie boli) zrobić najrozsądniejszy ruch - ładować PNG, a miniaturkę wykonywać jako JPG. W tym celu zmieniłem w powyższym kodzie, w ostatnich linijkach:
'imagepng' na 'imagejpeg', a i tak dalej otrzymywałem miniaturki w PNG. Ktoś może mi wyjaśnić czemu?
specialplan
Nie laduj takich wielkich obrazkow, albo zwieksz limit pamieci.

Przy 24 bitowej konwersji twoj obrazek wymaga 3 * 2886 * 1288 bajtow pamieci, co na oko daje ponad 11MB tongue.gif

A co do wielkosci obrazka wynikowego poczytaj: http://www.phptoys.com/e107_plugins/conten....php?content.46
sammael
Cytat
Ale czemu ta sama grafika w GIFIE (te same wymiary, większy "ciężar") da się załadować?


Bo GIF dysponuje niesamowicie okrojoną paletą barw (taka jego specyfika). Do reprezentacji jednego piksela GIFa w pamięci wystarczy jeden bajt a w przypadku PNG jeden piksel reprezentują trzy bajty dla kanałów RGB + jeden bajt na kanał alpha (z reguły bo ogólnie możliwa skala to 1-64 bitów na piksel).

Cytat
czy PNG sprawdza się tylko w przypadku naprawdę dużych plików graficznych?


Stopień kompresji w PNG nie jest regulowany tak jak np. w JPEG. Stopień kompresji zależy głównie od struktury obrazu a nie od jego rozmiarów.

Cytat
'imagepng' na 'imagejpeg', a i tak dalej otrzymywałem miniaturki w PNG. Ktoś może mi wyjaśnić czemu?


No to jest dziwne choć moim skromnym zdaniem nie ma bata żeby było tak jak napisałeś. Może po prostu w nazwie 'mapy/$plik_nazwa2' dałeś standardowo rozszerzenie PNG i myślisz, że to PNG mimo to, że jest to
JPEG? biggrin.gif
charlie-cherry
Dzięki za wyjaśnienia. Niestety, duże pliki graficzne (a raczej mapy) są ważnym punktem budowanej przeze mnie witryny.

Samael - faktycznie przegapiłem rozszerzenie pliku. Dzięki za zwrócenie uwagi.
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.