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";}
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?