Довольно часто приходится выводить изображение в ограниченной области. Стандартными средствами HTML этого не составляет труда. Теперь допустим, что изображение имеет большие размеры. Соответственно размеры файла этого изображения могут быть довольно большими. Передача такого файла клиенту может вызвать некоторые затруднения, к тому же увеличить трафик. Конечно можно уменьшить размеры изображения и хранить на сервере уже маленький рисунок. А если будет необходима его увеличенная копия? Что делать в такой ситуации? К счастью, с помощью функций PHP можно изменить размеры исходной картинки на лету и отправить клиенту уже приведенную к требуемым размерам картинку. Кроме этого, можно отобразить только часть исходного изображения.
Задача:
Требуется отобразить исходно изображение произвольного размера в области 400 х 400. При первом щелчке мыши по изображению отобразить часть исходной картинки увеличенной в 2 раза по сравнению с изображением, которое было вписано в область 400х400. При этом необходимо вывести ту часть картинки, по которому был сделан щелчок. При втором щелчке мыши снова отобразить исходную картинку вписанную в область. И так по кругу, отображая либо всю исходную картинку, либо ее часть.
Решение:
Решение этой задачи осуществляется с помощью двух сценариев – image.php и getimg.php.
image.php – определяет координаты щелчка с помощью java script, и выводит в область изображение. Изображение выводится с помощью конструкции
Чтобы было понятнее, упроченный вариант этой конструкции буде выглядеть так
<img src="getimg.php">
Т.е. вместо загрузки файла картинки он будет обращаться ко второму сценарию. А все что после «?» - это передача параметров.
getimg.php – обрабатывает картинку и возвращает требуемый результат. В зависимости от значения флага, результатом будет либо вся картинка, либо ее часть.
Image.php
<?php
//определяем входные параметры
$string = $string.$_SERVER['QUERY_STRING'];
if($string == "")
{
$file = "001"; //имя файла JPG избражения без расширения
//определяем координаты вставляемого изображения в зависимости от
//координат щелчка мыши
$x = 2*$st[x]-(800-$l2x)/2-200;
$y = 2*$st[y]-(800-$l2y)/2-200;
// учитываем, чтобы копируемый участок не выходил за пределы изображения
if($x<0){$x = 0;}
if($x>$l2x-400){$x = $l2x-400;}
if($y<0){$y = 0;}
if($y>$l2y-400){$y = $l2y-400;}
//копируем часть увеличенной картинки
imagecopy ($res,$res2,0,0,$x,$y,400,400);
}
//выводим полученный результат
imagepng($res);
?>
Комментарии в сценариях изложены доходчиво, поэтому на разборе останавливаться не будем.
Замечание:
Следует учесть, что координаты щелчка определяются относительно всего документа, а не относительно области. Чтобы исправить это, необходимо дополнительно определить координаты области относительно документа и с помощью нехитрых математических вычислений определить требуемые координаты относительно области.
Если ввести еще несколько параметров и немного изменив сценарий можно добиться многократного увеличения и пошагового уменьшения.