Каким будет лучший способ динамического изменения размера изображения в миниатюре, когда пользователь запрашивает фотографию? Изображения были загружены уже как jpg, которые приветствуют более 3 МБ? Я уже знаю имя файла из базы данных, изображение которого они запрашивают, например: photo100.jpg, поэтому создание миниатюры в php, а затем использование этой недавно созданной миниатюры t_photo100.jpg как img src = было бы идеальным
В php есть функции для этого. Посмотрите на этот учебник, чтобы посмотреть, как изменить размер изображений: http://net.tutsplus.com/tutorials/php/image-resizing-made-easy-with-php/
Затем направьте все ваши запросы изображения в файл php (используя .htaccess), который может найти запрошенный файл, передать оригинал через resizer, затем вывести новый миниатюру
Здесь вы можете посмотреть класс 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');
Вы можете использовать эту предварительную обработку один раз и показать новое созданное изображение.
Для этой цели вы можете использовать библиотеку, такую как 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" />
Проверьте демонстрационную страницу для получения дополнительных параметров.
Надеюсь это поможет!
На мой взгляд, самым простым способом было бы использовать 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) } } ?>
Нормальный, вы бы использовали что-то вроде этого:
<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, «сохранить» миниатюры, как только они были созданы, и просто вернуть этот файл, если это необходимо.
Кроме того, это приведет к обходу кэширования изображений браузеров, что приведет к увеличению трафика на каждой странице обновления.
От 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); ?>