Autor Zpráva
Spilky
Profil *
‎[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
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 se trefil přesněji.
joe
Profil
Davex:
Myslím, že právě ty jsi se trefil :) Popravdě vůbec nechápu jak to je, ale v dokumentaci mají, že tam je typ obrázku daný konstantou IMAGETYPE_XXX, na té stránce s konstantama mají, že jejich hodnotou jsou řetězce, ale přitom to někdo porovnává s číslem.

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 *
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
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 *
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 :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: