ugrás a tartalomhoz

on the fly képméretezés

Cadeyrn · 2006. Okt. 2. (H), 20.37
Üdv!

Vannak képeim, pl. 200*150-es méretben, ez már a butított verzió. Van egy PHP script, ami a config file alapján röptében átméretezi ezeket a képeket kisebbre, a config file-ban beállított értékű magassághoz.

Azonban mindez igencsak be tud lassulni egy bizonyos idő után, ráadásul nem tudom előre lekérni a képek méretét, ezért ugrálni fog a tartalom.

Tudom, hogy egyszerűbb lenne a config file változása után lefuttatni egy scriptet, ami megcsinálja a képeket, de pont ezt akarom kikerülni.

A kérdés tehát: mi a leggyorsabb, a gépet legkevésbé terhelő megoldás?



Előre is köszönöm,
Cadeyrn

U.I.: átkerestem a WL fórumát és a listaarchívumot is, erre konkrétan nem találtam választ.
 
1

cache on demand

Hodicska Gergely · 2006. Okt. 3. (K), 06.48
Eléggé sokféle megoldás létezhet, minden a körülményektől függ. Ha tudod az összes szükséges méretet, akkor érdemes lehet feltöltsékor legenereálni egy képhez a kisebb változatokat. Ha nem, akkor megteheted, hogy amikor egy adott méretre először van szükség, akkor hozod létre, és onnatól kezdve már azt használod. Azt, hogy ezt hogy éred el, kb. fantázia kérdése, lehet egy külön Smarty taged erre, vagy egy saját HTML taged, amit egy output filterrel cserélsz le, vagy mod_rewrite. Pl. vbencének is volt egy szép megoldása, amiből kiindulhatsz.


Felhő
2

hali

toxin · 2006. Okt. 3. (K), 09.58
napokban pakoltam össze az enyémet, (Sapid beli, amit ugye használok, meg írok (többekkel egyetemben ofkorsz :)) , http://sapid.sourceforge.net/ ) , némi zűr volt a kevés engedélyezett memóriával (átméretezéskor/imagecreatefromjpeg) azt tettem pluszba bele, feltötléskor kell átfuttani rajta, generálja thunb-ot stb. és le is tárloja adott helyen

<?PHP
// vim: set expandtab tabstop=4 shiftwidth=4:
// +----------------------------------------------------------------------+
// | SAPID: XML Sapiens Engine Demonstrator                               |
// +----------------------------------------------------------------------+
// | Author:  Max Baryshnikov aka Mephius <mb##kukac##rg.by>                      |
// | Copyright (c) 2004 Max Baryshnikov                                   |
// | http://sapid.sourceforge.net                                             |
// +----------------------------------------------------------------------+
// | This source file is free software; you can redistribute it and/or    |
// | modify it under the terms of the GNU Lesser General Public           |
// | License as published by the Free Software Foundation; either         |
// | version 2.1 of the License, or (at your option) any later version.   |
// |                                                                      |
// | This source file is distributed in the hope that it will be useful,  |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of       |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    |
// | Lesser General Public License for more details.                      |
// +----------------------------------------------------------------------+
// Release: 13.11.04 (dd/mm/yy)
// $Id: image_resize.inc.php,v 1.4 2006/03/11 17:54:13 sapidaddons Exp $

function _sysB_chkgd2()
{
    $rep=false;
    if(isset($GLOBALS["gBGDVersion"])) {
        $rep=$GLOBALS["gBGDVersion"];
    } else {
        //Edited by Zik
        $arr=get_loaded_extensions();
        if(in_array("gd", $arr) and function_exists(imagecreatetruecolor))
        $GLOBALS["gBGDVersion"]=$rep="2.0";
        elseif (in_array("gd", $arr) and !function_exists(imagecreatetruecolor))
        $GLOBALS["gBGDVersion"]=$rep="1.6";
    }
    return $GLOBALS["gBGDVersion"];
}


function create_tnail($file, $w, $h, $path_prefix, $name_prefix, $unlink=false){

   

    $GLOBALS["gBGDVersion"]=_sysB_chkgd2();
    if(intval($GLOBALS["gBGDVersion"])>=2){
        $resample_function="imagecopyresampled";
        $create_function="imageCreateTrueColor";
    }else{
        $resample_function="imagecopyresized";
        $create_function="imageCreate";
    }

    $info = $imageInfo = getimagesize($file["tmp_name"]);

    $MB = 1048576;  // number of bytes in 1M
    $K64 = 65536;    // number of bytes in 64K
    $TWEAKFACTOR = 3;  // Or whatever works for you
    $memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1]
    * $imageInfo['bits']
    * $imageInfo['channels'] / 8
    + $K64
    ) * $TWEAKFACTOR
    );

    //ini_get('memory_limit') only works if compiled with "--enable-memory-limit" also
    //Default memory limit is 8MB so well stick with that.
    //To find out what yours is, view your php.ini file.
    $memoryLimitMB = 8;
    $memoryLimit = $memoryLimitMB * $MB;
    if (function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded > $memoryLimit)
    {
        $newLimit = $memoryLimitMB + ceil( ( memory_get_usage()
        + $memoryNeeded
        - $memoryLimit
        ) / $MB
        );

        ini_set( 'memory_limit', $newLimit . 'M' );
        
    }

    switch ($info[2]) {
        case 1:
            $img=imagecreatefromgif($file["tmp_name"]);
            break;
        case 2:
            $img=imagecreatefromjpeg($file["tmp_name"]);
            break;
        case 3:
            $img=imagecreatefrompng($file["tmp_name"]);
            break;
    }

    if(($info[0]/$info[1])<=($w/$h)){
        $new_w=$w;
        $new_h=(int)(($w/$info[0])*$info[1]);
        if( !@($tmp_im=$create_function($new_w, $new_h)) ) return false;
        $resample_function($tmp_im, $img, 0, 0, 0, 0, $new_w, $new_h, $info[0], $info[1]);
        
        imagedestroy($img);
        $im=($create_function($w, $h));
        $offset=(int)(($new_h-$h)/2);
        imagecopy($im, $tmp_im, 0,0,0,$offset,$w, $h);

        $filename=$path_prefix . $name_prefix . $file["name"];
        touch($filename);
        imagejpeg($im, $filename, 75);

        imagedestroy($im);
        imagedestroy($tmp_im);

        if ($unlink) @unlink($file["tmp_name"]);
    }elseif (($info[0]/$info[1])>($w/$h)){
        $new_h=$h;
        $new_w=(int)(($h/$info[1])*$info[0]);
        if( !@($tmp_im=$create_function($new_w, $new_h)) ) return false;
        $resample_function($tmp_im, $img, 0, 0, 0, 0, $new_w, $new_h, $info[0], $info[1]);

        imagedestroy($img);
        $im=$create_function($w, $h);
        $offset=(int)(($new_w-$w)/2);
        imagecopy($im, $tmp_im, 0,0,$offset,0,$w, $h);

        $filename=$path_prefix . $name_prefix . $file["name"];
        touch($filename);
        imagejpeg($im, $filename, 75);

        imagedestroy($im);
        imagedestroy($tmp_im);

        if ($unlink) @unlink($file["tmp_name"]);
    }
    return array("init_width"=>$info[0], "init_height"=>$info[1]);
}


//create_tnail(array("tmp_name"=>$_SERVER["DOCUMENT_ROOT"] . "/sapid/usr/content/images/1.jpg", "name"=>"1.jpg"), 200, 200, $_SERVER["DOCUMENT_ROOT"] . "/sapid/usr/content/images/", "icon_", false);
?>

alul ott a példa, még nem toltam vissza cvs-be , ha vmi hiba lenne szóljatok, azt külön megkösszöném :)

üdv t