1

当用户请求照片时,将图像动态调整为缩略图的最佳方法是什么?图片已经上传为 3MB 以上的高分辨率 jpg 文件?我已经知道他们正在请求哪个图像的数据库中的文件名,例如:photo100.jpg,因此在 php 中创建一个缩略图,然后将新创建的缩略图 t_photo100.jpg 作为 img src= 提供将是理想的

4

7 回答 7

4

您可以在这里查看 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');

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

于 2013-08-21T17:38:44.463 回答
3

php中有一些函数可以做到这一点。查看本教程以了解如何调整图像大小:http: //net.tutsplus.com/tutorials/php/image-resizing-made-easy-with-php/

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

于 2013-08-21T17:34:25.973 回答
2

为此,您可以使用PHPThumb 之类的库。

它使用 ImageMagick(如果可用)和 PHP GD 库(随 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" />

查看演示页面以获取更多选项。

希望这可以帮助!

于 2013-08-21T17:33:02.870 回答
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) 
   } 
} 
?>
于 2013-08-21T17:34:41.347 回答
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 文件,以便在创建缩略图后“保存”缩略图,并在需要时简单地返回该文件。

这也将绕过浏览器的图像缓存,在每次页面刷新时导致更多的流量。

于 2013-08-21T17:35:28.327 回答
1

来自 PHP.net:

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

1:图像复制重新采样

<?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:图像复制大小

<?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);
?>
于 2013-08-21T17:41:32.950 回答
0

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

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

于 2020-10-08T02:22:30.190 回答