Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Превьюшки одного размера
 
 автор: SS   (31.08.2008 в 07:50)   письмо автору
 
 

Пожалуйста, помогите, никак не могу разобраться.
Ситуация такая: в цикле выводятся превьюшки в строчку. Ширина у всех одна (60 px), а вот высота разная. Смотрится не очень... Поэтому я хочу сделать их одной высоты, 80 px, но не за счет растяжения размеров, а за счет создания черного фона, вот так: http://ancientrome.ru/art/artwork/arch/rom/rome/atrium-vestae/atr001-0.jpg. Как это можно сделать на лету, без записи в файл?

  Ответить  
 
 автор: sim5   (31.08.2008 в 08:43)   письмо автору
 
   для: SS   (31.08.2008 в 07:50)
 

<?
$im 
imagecreatetruecolor(60,80);
imagefill($im000x0);
$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$pic0$y0060$h$wd$hd);
header("Content-type: image/jpeg");
imagejpeg($im);
imagedestroy($im);
imagedestroy($pic);
?>

Для изображений с альбомной ориентецией. Добавьте проверку пропорций для выбора стороны для "вписывания" и соответственно начальной координаты (по X или Y).

  Ответить  
 
 автор: SS   (31.08.2008 в 10:12)   письмо автору
 
   для: 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']."> ";
}
?>

  Ответить  
 
 автор: sim5   (31.08.2008 в 10:31)   письмо автору
 
   для: SS   (31.08.2008 в 10:12)
 

Это потому, что до передачи заголока уже был вывод в браузер. Вы после <img src=".$img['img0']."> задействуете скрипт уменьшения изображений? К тому же, у вас, видимо, есть вывод перед этим других заголовков?
Можно оформить функцией уменьшение изображений, поместив ее в отдельный скрипт. Ваш вывод изображений должен в этом случае выглядеть как, например:
<img src="scriptname.php?im=\"" .$img['img0']. "\" />, где scriptname.php, это файл с функцией уменьшения изображений. Либо нужно использовать буферизацию вывода.

  Ответить  
 
 автор: SS   (31.08.2008 в 11:12)   письмо автору
 
   для: 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"

  Ответить  
 
 автор: sim5   (31.08.2008 в 11:56)   письмо автору
 
   для: SS   (31.08.2008 в 11:12)
 

Ну вы думайте что делаете.
<img src=http://site.ru/scriptname.php?im=p0055-0.jpg>
А уж получая это имя в скрипте, добавляйте в ему путь, получая "art/p0055-0.jpg", если надо, то добавляя слешь и уровень в ничале пути.

  Ответить  
 
 автор: SS   (31.08.2008 в 12:21)   письмо автору
 
   для: 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> - и картинка не выводится.
Видимо, отсюда и проблема? или нет?

  Ответить  
 
 автор: sim5   (31.08.2008 в 12:28)   письмо автору
 
   для: SS   (31.08.2008 в 12:21)
 

>Вы меня неправильно поняли. В БД хранится полный адрес к превьюшке, а не ее имя.

Этого я просто не знал. А вот вы не понимаете, что так держать файлы в базе, это геморрой. Кто вам мешает "прикрутить" какой угодно путь к файлу после получения имени из базы? Это вообще ужас, а не подход к хранению данных. В таком случае, подставляйте ID записи этих файлов, а не их имена с путями, а в скрипте получайте путь после запроса к базе (вот уже геморрой).

  Ответить  
 
 автор: SS   (31.08.2008 в 14:00)   письмо автору
 
   для: sim5   (31.08.2008 в 12:28)
 

А попроще никак нельзя? Может, есть еще какие-то варианты? :)
Насчет происхождения геморроя: сайт создавался в 97-м году, когда никаких БД еще не было, в виде обычной структуры вложенных папок на 5-7 уровней, а уже впоследствии данные были импортированы в БД. Переделывать сейчас сайт уже нереально, слишком много работы. :(

  Ответить  
 
 автор: sim5   (31.08.2008 в 14:26)   письмо автору
 
   для: SS   (31.08.2008 в 14:00)
 

Ну берите полный путь, либо вырезайте имя из этого пути. Кстати, с помощью того же РНР, не так сложно модифицировать записи в базе, оставив только имена файлов, а пути, если они необходими, занести в файл конфигурации. Так, что руками не так много придется делать.

  Ответить  
 
 автор: SS   (31.08.2008 в 15:55)   письмо автору
 
   для: sim5   (31.08.2008 в 14:26)
 

Пожалуйста, приведите пример кода с полным путем, а то у меня никак не получается, уже пар идет.

  Ответить  
 
 автор: sim5   (31.08.2008 в 16:03)   письмо автору
 
   для: SS   (31.08.2008 в 15:55)
 

<?
$url 
"http://site.ru/art/p0055-0.jpg";
$file basename($url);
echo 
$file;
?>

  Ответить  
 
 автор: SS   (31.08.2008 в 16:19)   письмо автору
 
   для: sim5   (31.08.2008 в 16:03)
 

И куда это подставлять? Моя задача — вывести в цикле превьюшки одного размера. Пока что не получилось. Примеры моего запроса и вывода на экран я привел. Если не трудно, просто поправьте в моем коде, как это сделать и как это вывести, а то уже целый день переписываемся, а воз и ныне там. Еще раз прошу прощения за непонятливость и назойливость, но очень надо. :)

  Ответить  
 
 автор: sim5   (31.08.2008 в 16:33)   письмо автору
 
   для: SS   (31.08.2008 в 16:19)
 

Вы можете параметру запроса передавать как имя файла, так и ваш полный путь к нему. Например, назовем файл скрипта, который будет уменьшать изображение, как img_small.php и поместим в него функцию уменьшения изображения:
<?
function resizeImage($f$w$h) {
  
$im imagecreatetruecolor($w,$h);
  
imagefill($im000x0);
  
$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$y00$wr$hr$ws$hs);
  
header("Content-type: image/jpeg");
  
imagejpeg($im);
  
imagedestroy($im);
  
imagedestroy($pic);
}
//здесь если передаем только имя, то добавляем путь к нему
//иначе предаем полученный параметр
resizeImage($_GET['im'], 6080);
?>

В файле, в котором получаете из базы имена файлов, можете обрезать путь, получая только имя файла, либо весь полный путь:
<?
//только имя
echo "<img src=\"img_small.php?im=" .basename($img['img0']). "\" />";
//полный путь
echo "<img src=\"img_small.php?im=" .$img['img0']. "\" />";
//наличие файла желательно проверять, 
//чтобы не получать багов при выводе

В чем проблема?

  Ответить  
 
 автор: SS   (31.08.2008 в 16:51)   письмо автору
 
   для: sim5   (31.08.2008 в 16:33)
 

Все, победа! Спасибо! :))))

  Ответить  
 
 автор: SS   (31.08.2008 в 18:01)   письмо автору
 
   для: sim5   (31.08.2008 в 16:33)
 

Еще возникло два небольших вопроса:
1. Не обрабатывается gif.
2. Как выводить превьюшки с максимальным качеством? а то картинки после обработки заметно теряют в качестве.

  Ответить  
 
 автор: sim5   (31.08.2008 в 18:16)   письмо автору
 
   для: SS   (31.08.2008 в 18:01)
 

1. В функции уменьшения изображения определять тип изображения, которое нужно уменьшить. В зависимости от типа открывать и создавать соответсвуюший тип файла.
2. А вы хотите, сильно уменьшив изображение, не потерять в качестве? Для JPG изображения можно указывать третим параметром качество 100% (по умолчанию оно равно 75%):
imagejpeg($im, '', 100);

  Ответить  
 
 автор: mihdan   (31.08.2008 в 18:45)   письмо автору
 
   для: sim5   (31.08.2008 в 18:16)
 

Небольшое дополнение ответа sim5:


<?php
imagepng
($resource$filename$quality);

// $quality - коэффициент сжатия от 0 до 9
?>


http://ru.php.net/manual/ru/function.imagepng.php

  Ответить  
 
 автор: sl1p   (31.08.2008 в 10:31)   письмо автору
 
   для: SS   (31.08.2008 в 10:12)
 

находу без сохранения помоему нельзя..

ибо чтобы вывести изображение не сохраняя нужно соответственно заправить хидер..
а если он "заправлен" под картинку то остальное будет игнориться..

тю так а в чём трабл сохранять?)

  Ответить  
 
 автор: sim5   (31.08.2008 в 10:32)   письмо автору
 
   для: sl1p   (31.08.2008 в 10:31)
 

Можно без сохранения.

  Ответить  
 
 автор: sl1p   (31.08.2008 в 10:33)   письмо автору
 
   для: sim5   (31.08.2008 в 10:32)
 

тогда извиняюсь за ложную инфу:)

  Ответить  
 
 автор: sim5   (31.08.2008 в 10:41)   письмо автору
 
   для: sl1p   (31.08.2008 в 10:33)
 

А вы сначала думайте, а потом свою инфу публикуйте.

  Ответить  
 
 автор: sl1p   (31.08.2008 в 11:00)   письмо автору
 
   для: sim5   (31.08.2008 в 10:41)
 

я сказал потому что недавно тестил криво и так запомнилось просто)
я сказал что это предположительно)

  Ответить  
 
 автор: mihdan   (31.08.2008 в 18:47)   письмо автору
 
   для: sl1p   (31.08.2008 в 11:00)
 

Заходите на сайт http://ru.php.net почаще, меньше вопросов буит и скачайте себе документацию

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования