Ver Mensaje Individual
  #6 (permalink)  
Antiguo 13/02/2010, 13:05
skateloco
(Desactivado)
 
Fecha de Ingreso: febrero-2010
Mensajes: 17
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: DW reescalar imagen dinamica

para eso es la libreria GD (sirve para no distorcionar las imagenes)
ejemplo
si alguien sube una imagen un rectangulo y quieres que se muestre en un cuadrito, en lugar de estirar la imagen va a crear otra mucho mas pequeña tanto en peso como tamaño pero la foto original ba a estar guardada en una carpeta para que no se pierda

Después de copiar el codigo y ponerlo en alguna carpeta, supongamos que lo pusiste "librerias" y la imagen que quieres redimensionar a 200x150 pixeles es "laimagen.png" que se ubica en la carpeta "tusimagenes", solo escribes en el SRC de tu <img>:

/librerias/image.php?image=/tusimagenes/laimagen.png&width=200&height=150

Saludos. nota: tambien sirve para png y jpg pero no sirve para gifs animados

CREAS UN ARCHIVO image.php
Código PHP:
<?php
if (!isset($_GET['image']))
{
    
header('HTTP/1.1 400 Bad Request');
    echo 
'Error: no image was specified';
    exit();
}
define('MEMORY_TO_ALLOCATE',    '100M');
define('DEFAULT_QUALITY',        90);
define('CURRENT_DIR',            dirname(__FILE__));
define('CACHE_DIR_NAME',        '/imagecache/');
define('CACHE_DIR',                CURRENT_DIR CACHE_DIR_NAME);
define('DOCUMENT_ROOT',            $_SERVER['DOCUMENT_ROOT']);
$image            preg_replace('/^(s?f|ht)tps?:\/\/[^\/]+/i''', (string) $_GET['image']);
if (
$image{0} != '/' || strpos(dirname($image), ':') || preg_match('/(\.\.|<|>)/'$image))
{
    
header('HTTP/1.1 400 Bad Request');
    echo 
'Error: malformed image path. Image paths must begin with \'/\'';
    exit();
}

if (!
$image)
{
    
header('HTTP/1.1 400 Bad Request');
    echo 
'Error: no image was specified';
    exit();
}
$docRoot    preg_replace('/\/$/'''DOCUMENT_ROOT);
if (!
file_exists($docRoot $image))
{
    
header('HTTP/1.1 404 Not Found');
    echo 
'Error: image does not exist: ' $docRoot $image;
    exit();
}
$size    GetImageSize($docRoot $image);
$mime    $size['mime'];
if (
substr($mime06) != 'image/')
{
    
header('HTTP/1.1 400 Bad Request');
    echo 
'Error: requested file is not an accepted type: ' $docRoot $image;
    exit();
}
$width            $size[0];
$height            $size[1];

$maxWidth        = (isset($_GET['width'])) ? (int) $_GET['width'] : 0;
$maxHeight        = (isset($_GET['height'])) ? (int) $_GET['height'] : 0;

if (isset(
$_GET['color']))
    
$color        preg_replace('/[^0-9a-fA-F]/''', (string) $_GET['color']);
else
    
$color        FALSE;
if (!
$maxWidth && $maxHeight)
{
    
$maxWidth    99999999999999;
}
elseif (
$maxWidth && !$maxHeight)
{
    
$maxHeight    99999999999999;
}
elseif (
$color && !$maxWidth && !$maxHeight)
{
    
$maxWidth    $width;
    
$maxHeight    $height;
}
if ((!
$maxWidth && !$maxHeight) || (!$color && $maxWidth >= $width && $maxHeight >= $height))
{
    
$data    file_get_contents($docRoot '/' $image);
    
    
$lastModifiedString    gmdate('D, d M Y H:i:s'filemtime($docRoot '/' $image)) . ' GMT';
    
$etag                md5($data);
    
    
doConditionalGet($etag$lastModifiedString);
    
    
header("Content-type: $mime");
    
header('Content-Length: ' strlen($data));
    echo 
$data;
    exit();
}

$offsetX    0;
$offsetY    0;

if (isset(
$_GET['cropratio']))
{
    
$cropRatio        explode(':', (string) $_GET['cropratio']);
    if (
count($cropRatio) == 2)
    {
        
$ratioComputed        $width $height;
        
$cropRatioComputed    = (float) $cropRatio[0] / (float) $cropRatio[1];
        
        if (
$ratioComputed $cropRatioComputed)
        {
            
$origHeight    $height;
            
$height        $width $cropRatioComputed;
            
$offsetY    = ($origHeight $height) / 2;
        }
        else if (
$ratioComputed $cropRatioComputed)
        { 
            
$origWidth    $width;
            
$width        $height $cropRatioComputed;
            
$offsetX    = ($origWidth $width) / 2;
        }
    }
}
$xRatio        $maxWidth $width;
$yRatio        $maxHeight $height;
if (
$xRatio $height $maxHeight)

    
$tnHeight    ceil($xRatio $height);
    
$tnWidth    $maxWidth;
}
else
{
    
$tnWidth    ceil($yRatio $width);
     
$tnHeight    $maxHeight;
}

$quality    = (isset($_GET['quality'])) ? (int) $_GET['quality'] : DEFAULT_QUALITY;

$resizedImageSource        $tnWidth 'x' $tnHeight 'x' $quality;
if (
$color)
    
$resizedImageSource    .= 'x' $color;
if (isset(
$_GET['cropratio']))
    
$resizedImageSource    .= 'x' . (string) $_GET['cropratio'];
$resizedImageSource        .= '-' $image;

$resizedImage    md5($resizedImageSource);
    
$resized        CACHE_DIR $resizedImage;

if (!isset(
$_GET['nocache']) && file_exists($resized))
{
    
$imageModified    filemtime($docRoot $image);
    
$thumbModified    filemtime($resized);
    
    if(
$imageModified $thumbModified) {
        
$data    file_get_contents($resized);
    
        
$lastModifiedString    gmdate('D, d M Y H:i:s'$thumbModified) . ' GMT';
        
$etag                md5($data);
        
        
doConditionalGet($etag$lastModifiedString);
        
        
header("Content-type: $mime");
        
header('Content-Length: ' strlen($data));
        echo 
$data;
        exit();
    }
}

ini_set('memory_limit'MEMORY_TO_ALLOCATE);

$dst    imagecreatetruecolor($tnWidth$tnHeight);

switch (
$size['mime'])
{
    case 
'image/gif':
        
$creationFunction    'ImageCreateFromGif';
        
$outputFunction        'ImagePng';
        
$mime                'image/png'
        
$doSharpen            FALSE;
        
$quality            round(10 - ($quality 10)); 
    break;
    
    case 
'image/x-png':
    case 
'image/png':
        
$creationFunction    'ImageCreateFromPng';
        
$outputFunction        'ImagePng';
        
$doSharpen            FALSE;
        
$quality            round(10 - ($quality 10)); 
    break;
    
    default:
        
$creationFunction    'ImageCreateFromJpeg';
        
$outputFunction         'ImageJpeg';
        
$doSharpen            TRUE;
    break;
}

$src    $creationFunction($docRoot $image);

if (
in_array($size['mime'], array('image/gif''image/png')))
{
    if (!
$color)
    {
        
        
imagealphablending($dstfalse);
        
imagesavealpha($dsttrue);
    }
    else
    {
        if (
$color[0] == '#')
            
$color substr($color1);
        
$background    FALSE;
        if (
strlen($color) == 6)
            
$background    imagecolorallocate($dsthexdec($color[0].$color[1]), hexdec($color[2].$color[3]), hexdec($color[4].$color[5]));
        else if (
strlen($color) == 3)
            
$background    imagecolorallocate($dsthexdec($color[0].$color[0]), hexdec($color[1].$color[1]), hexdec($color[2].$color[2]));
        if (
$background)
            
imagefill($dst00$background);
    }
}
ImageCopyResampled($dst$src00$offsetX$offsetY$tnWidth$tnHeight$width$height);

if (
$doSharpen)
{
    
$sharpness    findSharp($width$tnWidth);
    
    
$sharpenMatrix    = array(
        array(-
1, -2, -1),
        array(-
2$sharpness 12, -2),
        array(-
1, -2, -1)
    );
    
$divisor        $sharpness;
    
$offset            0;
    
imageconvolution($dst$sharpenMatrix$divisor$offset);
}

if (!
file_exists(CACHE_DIR))
    
mkdir(CACHE_DIR0755);

if (!
is_readable(CACHE_DIR))
{
    
header('HTTP/1.1 500 Internal Server Error');
    echo 
'Error: the cache directory is not readable';
    exit();
}
else if (!
is_writable(CACHE_DIR))
{
    
header('HTTP/1.1 500 Internal Server Error');
    echo 
'Error: the cache directory is not writable';
    exit();
}

$outputFunction($dst$resized$quality);

ob_start();
$outputFunction($dstnull$quality);
$data    ob_get_contents();
ob_end_clean();
ImageDestroy($src);
ImageDestroy($dst);

$lastModifiedString    gmdate('D, d M Y H:i:s'filemtime($resized)) . ' GMT';
$etag                md5($data);

doConditionalGet($etag$lastModifiedString);

header("Content-type: $mime");
header('Content-Length: ' strlen($data));
echo 
$data;

function 
findSharp($orig$final)
{
    
$final    $final * (750.0 $orig);
    
$a        52;
    
$b        = -0.27810650887573124;
    
$c        .00047337278106508946;
    
    
$result $a $b $final $c $final $final;
    
    return 
max(round($result), 0);

function 
doConditionalGet($etag$lastModified)
{
    
header("Last-Modified: $lastModified");
    
header("ETag: \"{$etag}\"");
        
    
$if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ?
        
stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
        
false;
    
    
$if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ?
        
stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) :
        
false;
    
    if (!
$if_modified_since && !$if_none_match)
        return;
    
    if (
$if_none_match && $if_none_match != $etag && $if_none_match != '"' $etag '"')
        return; 
    
    if (
$if_modified_since && $if_modified_since != $lastModified)
        return; 
    
    
header('HTTP/1.1 304 Not Modified');
    exit();
}
?>