在PHP中动态调整大图像到缩略图的大小?

时间:2013-08-21 17:27:40

标签: php

当用户请求照片时,将图像动态调整为缩略图的最佳方法是什么?这些图片已经作为高分辨率超过3MB的jpgs上传了吗?我已经从数据库中知道了他们请求的图像的文件名,例如:photo100.jpg,所以在php中创建缩略图,然后将新创建的缩略图t_photo100.jpg作为img src =服务将是理想的

7 个答案:

答案 0 :(得分:3)

php中有函数可以执行此操作。查看本教程,了解如何调整图像大小:http://net.tutsplus.com/tutorials/php/image-resizing-made-easy-with-php/

然后将所有图像请求定向到可以找到所请求文件的php文件(使用.htaccess),通过大小调整器传递原始文件,然后输出新缩略图

答案 1 :(得分:3)

您可以在这里查看SimpleImage类:

http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/

我使用它,它非常简单。 基本上你可以做到

include('SimpleImage.php');
$image = new SimpleImage();
$image->load('picture.jpg');
$image->resize(250,400);
$image->save('picture2.jpg');

您可以使用此预处理一次并显示新创建的图像。

答案 2 :(得分:2)

您可以使用PHPThumb之类的库来实现此目的。

它使用ImageMagick(如果可用)和PHP GD Library(PHP v4.3.0 +附带)来处理图像。

配置和设置后,您可以动态生成图像缩略图,如下所示:

<img src="/uploads/phpThumb.php?src=images/logo.png&w=100" />

<img src="/uploads/phpThumb.php?src=images/foobar.png&h=50&w=50&zc=1" />

检查demo page以获取更多选项。

希望这有帮助!

答案 3 :(得分:1)

在我看来,最简单的方法是使用imagemagick(http://phpsnips.com/snip-111#.UhT5XZJwok0):

<?php 
// Location to upload main image: 
$mainDir = $_SERVER['DOCUMENT_ROOT'].'/images/l/'; 
// Location to create the thumb image: 
$smalDir = $_SERVER['DOCUMENT_ROOT'].'/images/s/'; 
// Command to use: 
$command = '/usr/bin/convert'; 
// Thumbnail width: 
$size = 210; 
// Make sure we have an image: 
if(isset($_POST['submit'])){ 
    if(getimagesize($_FILES['photo']['tmp_name'])){ 
        $name = $_FILES['photo']['name']; 
        $uploadfile = $mainDir . $name; 
        move_uploaded_file($_FILES['photo']['tmp_name'], $uploadfile); 
        $lrgImg = $mainDir . $name; 
        $smlImg = $smalDir . $name; 
        $imageMagick = $command . " '". $lrgImg . "' -resize '$size' '" . $smlImg . "'";         
        shell_exec($imageMagick); 
    } 
    header("Location: /test.php"); 
    exit; 
}else{ 
?> 
    <form action=" <?php echo $_SERVER['PHP_SELF']; ?> " method="post" enctype="multipart/form-data">
        <p><input type="file" name="photo" /></p>
        <p><input type="submit" value="Upload!" name="submit" /></p>
    </form>
<?php 
    foreach(glob($smalDir.'*') as $img){ 
        echo ' <img src="'.str_replace($_SERVER['DOCUMENT_ROOT'], '',$img).'" /> '; 
    } 
} 
?>

你也可以使用PHPGD(http://phpsnips.com/snip-5#.UhT5yJJwok0):

<?php 
function createThumbnail($imageDirectory, $imageName, $thumbDirectory, $thumbWidth, $quality){ 
    $details = getimagesize("$imageDirectory/$imageName") or die('Please only upload images.'); 
    $type = preg_replace('@^.+(?<=/)(.+)$@', '$1', $details['mime']); 
    eval('$srcImg = imagecreatefrom'.$type.'("$imageDirectory/$imageName");'); 
    $thumbHeight = $details[1] * ($thumbWidth / $details[0]); 
    $thumbImg = imagecreatetruecolor($thumbWidth, $thumbHeight); 
    imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $thumbWidth, $thumbHeight,  
    $details[0], $details[1]); 
    eval('image'.$type.'($thumbImg, "$thumbDirectory/$imageName"'. 
    (($type=='jpeg')?', $quality':'').');'); 
    imagedestroy($srcImg); 
    imagedestroy($thumbImg); 
} 

foreach ($_FILES["pictures"]["error"] as $key => $error) { 
   if ($error == UPLOAD_ERR_OK) { 
       $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; 
       $name = $_FILES["pictures"]["name"][$key]; 
       move_uploaded_file($tmp_name, "data/$name"); 
       createThumbnail("/location/of/main/image", $name, "/location/to/store/thumb", 120, 80); 
       //120 = thumb width  ::  80 = thumb quality (1-100) 
   } 
} 
?>

答案 4 :(得分:1)

Normaly你会使用这样的东西:

<img src="/images/uploads/image50.jpg" />

在生成html时将其替换为类似内容。

<img src="image.php?img_url=<?=base_64_encode("/images/uploads/image50.jpg")?>&width=128" />

然后使用像这样的image.php文件:

<?php

header("Content-Type: image/jpeg");

$imgUrl = base64_decode($_GET["img_url"]);
$c = file_get_contents($imgUrl);
$arr = getimagesizefromstring($c);

$img = imagecreatefromstring($c);

if (!is_array($arr)) {
    //remote image is not available. Use default one.
    $c = file_get_contents("include/images/nobanner.jpg");
}

if (isset($_GET["width"])){
  //Get Width and Height
  List($Width, $Height) = getimagesize($imgUrl);

   //Calc new Size
  $w = $_GET["width"];
  $h = $Height * ($w / $Width);

  //Build the image
  //Create new Base
  $NewImageBase = imagecreatetruecolor($w, $h);

  //copy image
  imagecopyresampled($NewImageBase, $img, 0, 0, 0, 0, $w, $h, $Width, $Height);
  $img = $NewImageBase;
}

imagejpeg($img);
?>

但请记住,每当有人访问图像时,这都会导致密集计算。您可以优化image.php文件,在创建缩略图后“保存”缩略图,如果需要,可以简单地返回该文件。

此外,这将绕过浏览器图像缓存,从而在每次刷新页面时产生更多流量。

答案 5 :(得分:1)

来自Php.net:

您可能需要的2个主要功能:

1: imagecopyresampled

<?php
// The file
$filename = 'test.jpg';

// Set a maximum height and width
$width = 200;
$height = 200;

// Content type
header('Content-Type: image/jpeg');

// Get new dimensions
list($width_orig, $height_orig) = getimagesize($filename);

$ratio_orig = $width_orig/$height_orig;

if ($width/$height > $ratio_orig) {
   $width = $height*$ratio_orig;
} else {
   $height = $width/$ratio_orig;
}

// Resample
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

// Output
imagejpeg($image_p, null, 100);
?>

2: imagecopyresized

<?php
// File and new size
$filename = 'test.jpg';
$percent = 0.5;

// Content type
header('Content-Type: image/jpeg');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
imagejpeg($thumb);
?>

答案 6 :(得分:0)

我也面临着类似的问题。我搜索了但找不到合适的解决方案。因此,我创建了一个。这将与CDN(cloudfront)一起使用,从而减少php网络服务器上的负载。我已经在不同设备尺寸的生产环境中运行过它,结果令人震惊。试试看:https://github.com/thekosmix/php-image-resizer

这是如何工作的:用http:// url / width / height / imagename打CDN。如果它在CDN中存在,它将被送达。否则它将进入php服务器,调整原始图像的大小并将其存储在CDN上,并从那里开始为每个请求提供服务。