2012-05-02 2 views
0

Этот код давал мне вопросы в течение нескольких недель и не приблизились к ее решению ...PHP изменить размер изображения, своего рода работает

function create_thumbnail($source, $destination, $thumb_width){ 
    $extension = get_image_extension($source); 
    $size = getimagesize($source); 
    $imageWidth = $newWidth = $size[0]; 
    $imageHeight = $newheight = $size[1]; 

    if ($imageWidth > $thumb_width || $imageHeight > $thumb_width) 
    { 
     // Calculate the ratio 
     $xscale = ($imageWidth/$thumb_width); 
     $yscale = ($imageHeight/$thumb_width); 
     $newWidth = ($yscale > $xscale) ? round($imageWidth * (1/$yscale)) : round($imageWidth * (1/$xscale)); 
     $newHeight = ($yscale > $xscale) ? round($imageHeight * (1/$yscale)) : round($imageHeight * (1/$xscale)); 
    } 

    $newImage = imagecreatetruecolor($newWidth, $newHeight); 

    switch ($extension) 
    { 
     case 'jpeg': 
     case 'jpg': 
      $imageCreateFrom = 'imagecreatefromjpeg'; 
      $store = 'imagejpeg'; 
      break; 

     case 'png': 
      $imageCreateFrom = 'imagecreatefrompng'; 
      $store = 'imagepng'; 
      break; 

     case 'gif': 
      $imageCreateFrom = 'imagecreatefromgif'; 
      $store = 'imagegif'; 
      break; 

     default: 
      return false; 
    } 

    $container = $imageCreateFrom($source); 
    imagecopyresampled($newImage, $container, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight); 
    return $store($newImage, $destination); 
} 

Сейчас он работает нормально, но пространство, что эти (высота) - 225 (ширина), а иногда я получаю изображения, которые являются высокими и тощими, а некоторые короткие и широкие изображения, что затрудняет их размещение в пространстве, в идеале, если я может изменять размеры этих изображений, когда они сжимаются или обрезаются, но я не уверен, что это возможно ... Разве это?

Если это невозможно, я думаю, что я хочу настроить этот код, чтобы его изображение было высоким и тощим для изменения размера с высотой 200 и, если изображение было широким и коротким, чтобы изменить размер до ширины 225 .. .Я надеюсь в этом есть смысл.

В любом случае, любые советы, советы или что-то будет оценено по достоинству.

Я попытался запустить mschr код (который находится ниже в ответах) и получил эти ошибки

Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions in /home/content/44/8713044/html/admin/Home.php on line 321 

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /home/content/44/8713044/html/admin/Home.php on line 323 

Warning: Cannot modify header information - headers already sent by (output started at /home/content/44/8713044/html/admin/include/header.php:7) in /home/content/44/8713044/html/admin/Home.php on line 325 

Warning: imagejpeg(): supplied argument is not a valid Image resource in /home/content/44/8713044/html/admin/Home.php on line 329 

Warning: imagedestroy(): supplied argument is not a valid Image resource in /home/content/44/8713044/html/admin/Home.php on line 334 
+0

ваша функция возвращает true/false и устанавливает $ destination, вставка, которую я дал, посылает изображения в выходной поток (записывает их). – mschr

ответ

0

Вот как я это сделать; $ Ш и $ ч запрашиваются размер, $ nHeight и $ nWidth результате тусклый - отстаивание соотношение сторон

function thumb($img, $w = 100, $h = 100, $fill = true) { 
    if (!extension_loaded('gd') && !extension_loaded('gd2')) { 
     trigger_error("No dispones de la libreria GD para generar la imagen.", E_USER_WARNING); 
     return false; 
    } 

    $imgInfo = getimagesize($img); 
    switch ($imgInfo[2]) { 
     case 1: $im = imagecreatefromgif($img); break; 
     case 2: $im = imagecreatefromjpeg($img); break; 
     case 3: $im = imagecreatefrompng($img); break; 
     default: trigger_error('Tipo de imagen no reconocido.', E_USER_WARNING); break; 
    } 
    // note, how the lesser ratio is chosen 
    if ($imgInfo[0] <= $w && $imgInfo[1] <= $h && !$fill) { 
     $nHeight = $imgInfo[1]; 
     $nWidth = $imgInfo[0]; 
    }else{ 
     if ($w/$imgInfo[0] < $h/$imgInfo[1]) { 
      $nWidth = $w; 
      $nHeight = $imgInfo[1]*($w/$imgInfo[0]); 
     }else{ 
      $nWidth = $imgInfo[0]*($h/$imgInfo[1]); 
      $nHeight = $h; 
     } 
    } 

    $nWidth = round($nWidth); 
    $nHeight = round($nHeight); 

    $newImg = imagecreatetruecolor($nWidth, $nHeight); 

    imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $imgInfo[0], $imgInfo[1]); 

    header("Content-type: ". $imgInfo['mime']); 

    switch ($imgInfo[2]) { 
     case 1: imagegif($newImg); break; 
     case 2: imagejpeg($newImg); break; 
     case 3: imagepng($newImg); break; 
     default: trigger_error('Imposible mostrar la imagen.', E_USER_WARNING); break; 
    } 

    imagedestroy($newImg); 
} 
+0

что бы я заменил это в своей функции? – user979331

+0

заполнение в покое, просто используйте полную функцию =) – mschr

+0

им просто путают с переменными здесь, поэтому, когда я запускаю этот скрипт 'imagecopyresampled ($ newImage, $ container, 0, 0, 0, 0, $ newWidth, $ newHeight, $ imageWidth, $ imageHeight); 'его заменить, как это: imagecopyresampled ($ newImage, $ container, 0, 0, 0, 0, $ nWidth, $ nHeight, $ imageWidth, $ imageHeight);' – user979331

0

Ах я вижу .. Вы хотите установить $ назначения с вашим ImageData, выше пост показывает функцию, которая будет служить изображение через запрос GET так:

http://localhost/thumbnail.php?w=500&h=300&file=./images/bigimage.png

в то время как thumbnail.php содержит функцию 'большого пальца' и называет его

<? thumb($_GET['file'], $_GET['w'], $_GET['h']); ?> 

То, что вы хотите, чтобы 1) Изменить параметры пальца учи- принимая $ назначения 2) удалить заголовок («Content-Type ...») линии 3) перепишем в последнем случае выключателя на:

switch ($imgInfo[2]) { 
    case 1: return imagegif($newImg, $destination); 
    case 2: return imagejpeg($newImg, $destination); 
    case 3: return imagepng($newImg, $destination); 
    default: trigger_error('Imposible mostrar la imagen.', E_USER_WARNING); break; 
} 
return false; 
Смежные вопросы