|
|
|
| Пожалуйста, помогите, никак не могу разобраться.
Ситуация такая: в цикле выводятся превьюшки в строчку. Ширина у всех одна (60 px), а вот высота разная. Смотрится не очень... Поэтому я хочу сделать их одной высоты, 80 px, но не за счет растяжения размеров, а за счет создания черного фона, вот так: http://ancientrome.ru/art/artwork/arch/rom/rome/atrium-vestae/atr001-0.jpg. Как это можно сделать на лету, без записи в файл? | |
|
|
|
|
|
|
|
для: SS
(31.08.2008 в 07:50)
| |
<?
$im = imagecreatetruecolor(60,80);
imagefill($im, 0, 0, 0x0);
$pic = imagecreatefromjpeg('image.jpg');
$wd = imagesx($pic);
$hd = imagesy($pic);
$w = round((60/$wd)*100);
$h = round(($hd * $w)/100);
$y = (80-$h)/2;
imagecopyresampled($im, $pic, 0, $y, 0, 0, 60, $h, $wd, $hd);
header("Content-type: image/jpeg");
imagejpeg($im);
imagedestroy($im);
imagedestroy($pic);
?>
|
Для изображений с альбомной ориентецией. Добавьте проверку пропорций для выбора стороны для "вписывания" и соответственно начальной координаты (по X или Y). | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 08:43)
| | Прошу извинить мне мою непонятливость, но у меня получается вывести только одну картинку, а в цикле ничего не удается, ругается "Warning: Cannot modify header information - headers already sent by (output started at...". Что я делаю не так? Пожалуйста, поправьте меня. Вот мой запрос:
<?php
$query = "SELECT * FROM art LIMIT 10";
$tb = mysql_query($query);
if(!$tb) exit(mysql_error());
while($img = mysql_fetch_array($tb))
{
echo " <img src=".$img['img0']."> ";
}
?>
|
| |
|
|
|
|
|
|
|
для: SS
(31.08.2008 в 10:12)
| | Это потому, что до передачи заголока уже был вывод в браузер. Вы после <img src=".$img['img0']."> задействуете скрипт уменьшения изображений? К тому же, у вас, видимо, есть вывод перед этим других заголовков?
Можно оформить функцией уменьшение изображений, поместив ее в отдельный скрипт. Ваш вывод изображений должен в этом случае выглядеть как, например:
<img src="scriptname.php?im=\"" .$img['img0']. "\" />, где scriptname.php, это файл с функцией уменьшения изображений. Либо нужно использовать буферизацию вывода. | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 10:31)
| | Что-то не получается... Ссылка на картинку не работает и выглядит при выводе так:
<img src=http://site.ru/scriptname.php?im=http://site.ru/art/p0055-0.jpg>
У меня "img0" - это полный адрес превьюшки, т.е. в данном примере "http://site.ru/art/p0055-0.jpg" | |
|
|
|
|
|
|
|
для: SS
(31.08.2008 в 11:12)
| | Ну вы думайте что делаете.
<img src=http://site.ru/scriptname.php?im=p0055-0.jpg>
А уж получая это имя в скрипте, добавляйте в ему путь, получая "art/p0055-0.jpg", если надо, то добавляя слешь и уровень в ничале пути. | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 11:56)
| | Вы меня неправильно поняли. В БД хранится полный адрес к превьюшке, а не ее имя.
Т.е. img0 = http://site.ru/art/p0055-0.jpg, а не p0055-0.jpg
Это связано со структурой сайта, потому что картинки находятся в разных папках на разных уровнях.
Поэтому и адрес картинки выглядит именно как я привел:
<img src=http://site.ru/scriptname.php?im=http://site.ru/art/p0055-0.jpg> - и картинка не выводится.
Видимо, отсюда и проблема? или нет? | |
|
|
|
|
|
|
|
для: SS
(31.08.2008 в 12:21)
| | >Вы меня неправильно поняли. В БД хранится полный адрес к превьюшке, а не ее имя.
Этого я просто не знал. А вот вы не понимаете, что так держать файлы в базе, это геморрой. Кто вам мешает "прикрутить" какой угодно путь к файлу после получения имени из базы? Это вообще ужас, а не подход к хранению данных. В таком случае, подставляйте ID записи этих файлов, а не их имена с путями, а в скрипте получайте путь после запроса к базе (вот уже геморрой). | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 12:28)
| | А попроще никак нельзя? Может, есть еще какие-то варианты? :)
Насчет происхождения геморроя: сайт создавался в 97-м году, когда никаких БД еще не было, в виде обычной структуры вложенных папок на 5-7 уровней, а уже впоследствии данные были импортированы в БД. Переделывать сейчас сайт уже нереально, слишком много работы. :( | |
|
|
|
|
|
|
|
для: SS
(31.08.2008 в 14:00)
| | Ну берите полный путь, либо вырезайте имя из этого пути. Кстати, с помощью того же РНР, не так сложно модифицировать записи в базе, оставив только имена файлов, а пути, если они необходими, занести в файл конфигурации. Так, что руками не так много придется делать. | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 14:26)
| | Пожалуйста, приведите пример кода с полным путем, а то у меня никак не получается, уже пар идет. | |
|
|
|
|
|
|
|
для: SS
(31.08.2008 в 15:55)
| |
<?
$url = "http://site.ru/art/p0055-0.jpg";
$file = basename($url);
echo $file;
?>
|
| |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 16:03)
| | И куда это подставлять? Моя задача — вывести в цикле превьюшки одного размера. Пока что не получилось. Примеры моего запроса и вывода на экран я привел. Если не трудно, просто поправьте в моем коде, как это сделать и как это вывести, а то уже целый день переписываемся, а воз и ныне там. Еще раз прошу прощения за непонятливость и назойливость, но очень надо. :) | |
|
|
|
|
|
|
|
для: SS
(31.08.2008 в 16:19)
| | Вы можете параметру запроса передавать как имя файла, так и ваш полный путь к нему. Например, назовем файл скрипта, который будет уменьшать изображение, как img_small.php и поместим в него функцию уменьшения изображения:
<?
function resizeImage($f, $w, $h) {
$im = imagecreatetruecolor($w,$h);
imagefill($im, 0, 0, 0x0);
$pic = imagecreatefromjpeg($f);
$x = $y = 0;
$wr = $w; $hr = $h;
$ws = imagesx($pic);
$hs = imagesy($pic);
if ($ws/$hs < 1) {
$wr = round(($ws * ($h/$hs)*100)/100);
$x = ($w-$wr)>>1;
} else {
$hr = round(($hs * ($w/$ws)*100)/100);
$y = ($h-$hr)>>1;
}
imagecopyresampled($im, $pic, $x, $y, 0, 0, $wr, $hr, $ws, $hs);
header("Content-type: image/jpeg");
imagejpeg($im);
imagedestroy($im);
imagedestroy($pic);
}
//здесь если передаем только имя, то добавляем путь к нему
//иначе предаем полученный параметр
resizeImage($_GET['im'], 60, 80);
?>
|
В файле, в котором получаете из базы имена файлов, можете обрезать путь, получая только имя файла, либо весь полный путь:
<?
//только имя
echo "<img src=\"img_small.php?im=" .basename($img['img0']). "\" />";
//полный путь
echo "<img src=\"img_small.php?im=" .$img['img0']. "\" />";
//наличие файла желательно проверять,
//чтобы не получать багов при выводе
|
В чем проблема? | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 16:33)
| | Все, победа! Спасибо! :)))) | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 16:33)
| | Еще возникло два небольших вопроса:
1. Не обрабатывается gif.
2. Как выводить превьюшки с максимальным качеством? а то картинки после обработки заметно теряют в качестве. | |
|
|
|
|
|
|
|
для: SS
(31.08.2008 в 18:01)
| | 1. В функции уменьшения изображения определять тип изображения, которое нужно уменьшить. В зависимости от типа открывать и создавать соответсвуюший тип файла.
2. А вы хотите, сильно уменьшив изображение, не потерять в качестве? Для JPG изображения можно указывать третим параметром качество 100% (по умолчанию оно равно 75%):
imagejpeg($im, '', 100); | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 18:16)
| | Небольшое дополнение ответа sim5:
<?php
imagepng($resource, $filename, $quality);
// $quality - коэффициент сжатия от 0 до 9
?>
|
http://ru.php.net/manual/ru/function.imagepng.php | |
|
|
|
|
|
|
|
для: SS
(31.08.2008 в 10:12)
| | находу без сохранения помоему нельзя..
ибо чтобы вывести изображение не сохраняя нужно соответственно заправить хидер..
а если он "заправлен" под картинку то остальное будет игнориться..
тю так а в чём трабл сохранять?) | |
|
|
|
|
|
|
|
для: sl1p
(31.08.2008 в 10:31)
| | Можно без сохранения. | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 10:32)
| | тогда извиняюсь за ложную инфу:) | |
|
|
|
|
|
|
|
для: sl1p
(31.08.2008 в 10:33)
| | А вы сначала думайте, а потом свою инфу публикуйте. | |
|
|
|
|
|
|
|
для: sim5
(31.08.2008 в 10:41)
| | я сказал потому что недавно тестил криво и так запомнилось просто)
я сказал что это предположительно) | |
|
|
|
|
|
|
|
для: sl1p
(31.08.2008 в 11:00)
| | Заходите на сайт http://ru.php.net почаще, меньше вопросов буит и скачайте себе документацию | |
|
|
|