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