Autor | Zpráva | ||
---|---|---|---|
Spilky Profil * |
#1 · Zasláno: 27. 1. 2013, 00:25:17
[PHP] Zdravím, mám v PHP funkci na zmenšení a oříznutí obrázku, ale u obrázku s většími rozměry nefunguje, napadá někoho proč? Sekne se to u prvního switche, před echo"4";
/** Pøevzorkování a oøezání obrázku GIF, PNG nebo JPG na danou velikost * @author Rostislav Wolný <costa> * @param string $file_in název zmenšovaného souboru * @param string $file_out název výsledného souboru * @param int $width šíøka výsledného obrázku * @param int $height výška výsledného obrázku * @return bool true, false v pøípadì chyby */ function imageResizeCrop($file_in, $file_out, $width, $height) { $imagesize = getimagesize($file_in); echo"1"; if ((!$width && !$height) || !$imagesize[0] || !$imagesize[1]) { return false; } echo"2"; if ($imagesize[0] == $width && $imagesize[1] == $height) { return copy($file_in, $file_out); } echo"3"; switch ($imagesize[2]) { case 1: $img = imagecreatefromgif($file_in); break; case 2: $img = imagecreatefromjpeg($file_in); break; case 3: $img = imagecreatefrompng($file_in); break; default: return false; } echo"4"; if (!$img) { return false; } echo"5"; $width_ratio = $width/$imagesize[0]; $height_ratio = $height/$imagesize[1]; echo"6"; if($height_ratio >= $width_ratio) { $test_height = $imagesize[1] * $width_ratio; if($test_height >= $height) $lead_width = 1; else $lead_width = 0; } else { $test_width = $imagesize[0] * $heigth_ratio; if($test_width >= $width) $lead_width = 0; else $lead_width = 1; } echo"7"; if($lead_width) { $temp_width = $width; $temp_height = $imagesize[1] * $width_ratio; } else { $temp_height = $height; $temp_width = $imagesize[0] * $height_ratio; } echo"8"; $img_temp = imagecreatetruecolor($temp_width, $temp_height); imagecopyresampled($img_temp, $img, 0, 0, 0, 0, $temp_width, $temp_height, $imagesize[0], $imagesize[1]); echo"9"; $coords['y'] = ($temp_height - $height)/2; $coords['x'] = ($temp_width - $width)/2; echo"10"; $img2 = imagecreatetruecolor($width, $height); imagecopyresampled($img2, $img_temp, 0, 0, $coords['x'], $coords['y'], $width, $height, $width, $height); echo"11"; if ($imagesize[2] == 2) { return imagejpeg($img2, $file_out); } elseif ($imagesize[2] == 1 && function_exists("imagegif")) { imagetruecolortopalette($img2, false, 256); return imagegif($img2, $file_out); } else { return imagepng($img2, $file_out); } echo"12"; } |
||
joe Profil |
#2 · Zasláno: 27. 1. 2013, 01:01:39
Co znamená sekne?
Podle dokumentace funkce getImageSize, najdeš v $imagesize[2] typ obrázku:
Index 2 is one of the IMAGETYPE_XXX constants indicating the type of the image. a ty porovnáváš čísla. Takže je možné, že dojde k tomu return false; na řádku 25.
|
||
Davex Profil |
U hodně velkého obrázku skončí skript na řádcích 22 až 24 z důvodu nedostatku paměti, protože se tam obrázek nevejde.
|
||
joe Profil |
Davex:
Myslím, že právě ty jsi se trefil :) Spilky: Na první řádek do té funkce bych si napsal list($imageWidth, $imageHeight, $imageType, $imageAttributes) = getImageSize($file_in); a pak místo psaní $imagesize[0] bych psal $imageWidth , místo $imagesize[1] bych psal $imageHeight , atd...
Pod ten řádek bych přidal var_dump($imageType); a uvidíš, jaký typ obrázku zkoušíš zpracovávat. Davex: Aha, už jsem si taky všimnul, že to je dokumentace k funkci image_type_to_mime_type :), díky
|
||
Davex Profil |
Aha, ty konstanty mají hodnoty číselné a na řetězec se převádějí funkcí
image_type_to_mime_type .
IMAGETYPE_GIF 1 image/gif IMAGETYPE_JPEG 2 image/jpeg IMAGETYPE_PNG 3 image/png V tom případě by se měl switch porovnávat přímo s těmi konstantami.
switch ($imagesize[2]) { case IMAGETYPE_GIF: $img = imagecreatefromgif($file_in); break; case IMAGETYPE_JPEG: $img = imagecreatefromjpeg($file_in); break; case IMAGETYPE_PNG: $img = imagecreatefrompng($file_in); break; default: return false; } |
||
Spilky Profil * |
#6 · Zasláno: 27. 1. 2013, 12:23:24 · Upravil/a: Spilky
No memory_limit na hostingu je nastavený na 32MB, myslíte, že je to málo? Jinak děkuji za rady na úpravu té funkce.
[#6] Spilky |
||
Davex Profil |
#7 · Zasláno: 27. 1. 2013, 12:58:22
Spilky:
„No memory_limit na hostingu je nastavený na 32MB, myslíte, že je to málo?“ V dnešní době je 32 MB zoufale málo, ale na fotku o rozlišení 5 Mpix by to mohlo stačit. |
||
Spilky Profil * |
#8 · Zasláno: 27. 1. 2013, 14:45:26
Tak jsem vyzkoušel funkci na localhostu s 128MB memory_limit, tak jde, ale jde i na localhostu s 32MB memory_limit, taky šlo a pak ještě na hostingu se 128MB memory_limit a tam to také jde, takže by mě už jen ze zvědavosti zajímalo, kde byla chyba :)
|
||
Časová prodleva: 11 let
|
0