На днях я написал небольшой скрипт, позволяющий кешировать картинки. Собственно, и делюсь со всеми моими читателями :)
Кеширование — накопление данных в доступном хранилище, с целью их быстрого извлечения по мере надобности. Конкретно для нашего случая — это создание картинок в заданном размере при запросе пользователя, сохранение в папке caсhe и вывод их на экран.
Создаем файл в корневой директории pic.php и вставляем в него следующий код:
<?php
function createthumbnail($filetype, $origfile, $thumbfile, $new_w, $new_h, $par)
{
if ($filetype == 1) { $origimage = imagecreatefromgif($origfile); }
elseif ($filetype == 2) { $origimage = imagecreatefromjpeg($origfile); }
elseif ($filetype == 3) { $origimage = imagecreatefrompng($origfile); }
$old_x = imagesx($origimage);
$old_y = imagesy($origimage);
if ($old_x > $new_w || $old_y > $new_h) {
if (($old_x < $old_y) && $par == "n") {
$thumb_w = round(($old_x * $new_h) / $old_y);
$thumb_h = $new_h;
} elseif (($old_x > $old_y) && $par == "n") {
$thumb_w = $new_w;
$thumb_h = round(($old_y * $new_w) / $old_x);
} elseif (($old_x < $old_y) && $par == "s") {
$thumb_w = $new_w;
$thumb_h = round(($old_y * $new_w) / $old_x);
} elseif (($old_x > $old_y) && $par == "s") {
$thumb_w = $new_w;
$thumb_h = round(($old_y * $new_w) / $old_x);
} else {
$thumb_w = $new_w;
$thumb_h = $new_h;
}
} else {
$thumb_w = $old_x;
$thumb_h = $old_y;
}
$thumbimage = imagecreatetruecolor($thumb_w,$thumb_h);
$result = imagecopyresampled($thumbimage, $origimage, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);
touch($thumbfile);
if ($filetype == 1) { imagegif($thumbimage, $thumbfile); }
elseif ($filetype == 2) { imagejpeg($thumbimage, $thumbfile); }
elseif ($filetype == 3) { imagepng($thumbimage, $thumbfile); }
}
if (isset($_GET['url']) && $_GET['url'] != "" && isset($_GET['w']) && $_GET['w'] != "" && isset($_GET['p']) && ($_GET['p'] == "n" || $_GET['p'] == "s")) {
$url = $_GET['url'];
$width = $_GET['w'];
$height = (isset($_GET['h']) ? $_GET['h'] : '500');
$par = $_GET['p'];
$pic_types = array(".gif",".jpg",".jpeg",".png");
$pic = basename($url);
$pic_name = explode(".", $pic);
$pic_ext = strtolower(strrchr($pic,"."));
if (!in_array($pic_ext, $pic_types)) {
exit();
} else {
$imagefile = getimagesize($url);
$thumb = "cache/".$pic_name[0]."_".$width.$par.$pic_ext;
if (!file_exists($thumb) || filesize($thumb) == 0) {
createthumbnail($imagefile[2], $url, $thumb, $width, $height, $par);
}
}
header("Location: ".$thumb);
}
?>
Не забываем создать папку cache так же в корневой директории.
Ну а сейчас разберемся как это все работает на конкретном примере.
Допустим у нас есть картинка kartinka.jpg лежащая в папке images. Скрипт приведенный выше может кешировать картинки в 2 разных ситуациях.
Первая ситуация заключается в том, когда нам надо уменьшить картинку только по ширине, т. е. ширина фиксируется, а высота подгоняется, сохраняя пропорции. В этом случае путь до картинки имеет вид:
<img src="pic.php?url=images/kartinka.jpg&w=100&p=s">
где url=images/kartinka.jpg — путь до оригинальной киртинки, w=100 — ширина создаваемой картинки, а p=s — показатель того, что высоту картинки нужно подогнать по пропорциям исходя из ширины.
Второй случай — это когда нужно вместить картинку в заданную область с сохранением пропорций. Тогда код имеет следующий вид:
<img src="pic.php?url=images/kartinka.jpg&w=100&h=100&p=n">
где url=images/kartinka.jpg — путь до оригинальной киртинки, w=100 — ширина создаваемой картинки, h=100 — высота создаваемой картинки, а p=n — показатель того, что картинку нужно уместить в заданную область, сохраняя пропорции.
Для чего нужно кеширование? А нужно оно, например, для того чтобы экономить место на сайте, ведь все файлы из папки cache можно удалить в любое время. Они будут созданы занова при запросе пользователя. Или, например, если вы меняете структуру или дизайн сайта и нужно чтобы превью картинок оригинального размера были не 100 пикселей в ширину а, например, 150, то для этого достаточно изменить показатель w и все будет хорошо :)
P. S. Скрипт работает на библиотеке изображений GD2.