| 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: 14 let
|
|||
0