Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] [gd] Dwa problemy z PNG
charlie-cherry
post 7.02.2008, 16:35:31
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 15.12.2007

Ostrzeżenie: (0%)
-----


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?

Ten post edytował charlie-cherry 7.02.2008, 16:54:52
Go to the top of the page
+Quote Post
specialplan
post 7.02.2008, 16:51:34
Post #2





Grupa: Zarejestrowani
Postów: 206
Pomógł: 21
Dołączył: 1.09.2006
Skąd: Edinburgh

Ostrzeżenie: (0%)
-----


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

Ten post edytował specialplan 7.02.2008, 16:58:22
Go to the top of the page
+Quote Post
sammael
post 7.02.2008, 17:18:15
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 1
Dołączył: 5.02.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
charlie-cherry
post 7.02.2008, 20:03:53
Post #4





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 15.12.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 03:26