Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ресайзинг картинки из mysql (тип BLOB), сложности с ресайзингом 
:(
    Опции темы
constructor
Дата 6.11.2003, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.11.2003

Репутация: нет
Всего: нет



Здравсвуйте, здесь я новичок. Приятно будет познакомится.
Меня зовут Руслан aka constructor.

В php \ mysql разбираюсь,точнее пытаюсь, посему есть сложности с предметом smile.gif надеюсь найти помощь

Дело в том,что есть есть мускулбная ьаза с неким полем imp_path типа BLOB, в котрое успешно заливаются картинки.
На входе фильрация пот типу и размеру, не суть. Попадают тольок jpeg и gif до 30кБ .
Но это не важно.

Соотвественно для отображения их необходимо серз дополн.скриптик задать хидер (getimage.php?ID="номер каринки")

Код

if ($visible==NULL) $visible=1;  //флаг "видимости картинки, в целях отладки

//конект к базе опускаю за ненадобностью

$result=mysql_query("SELECT id_img,path_img FROM images_tb WHERE id_img='$ID' AND visible_img='$visible' ") or die("SQL ERROR in line ".__LINE__.", function mysql_query");

if (mysql_result($result,0,"id_img"))
{
    $image=mysql_result($result,0,"path_img");
    $ImageMIME=getimagesize ($image); //получим тип картинки (mime) {$ImageMIME['mime']}

   header("Content-type: {$ImageMIME['mime']}"); //image/pjpeg
       echo $image;  
       
}else {
          echo "background не найден. Ну нет его в базе.";
          exit;
         }


из скрипта show.php я получаю данные картинки по иду: (show.php)
Код

//опять конект опускаю
$result=mysql_query("SELECT id_img,path_img,name_img,author_img,category_img,data_img FROM images_tb WHERE visible_img='1' ORDER BY data_img ") or die("SQL ERROR in line ".__LINE__.", function mysql_query");
$CountID=mysql_NumRows($result); //количество записей

if ($row = mysql_fetch_array($result))  
{
    echo"
     <html><head>
       <meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">
       <link href=\"common/base.css\" rel=\"stylesheet\" type=\"text/css\"></head><body>";
   
    do {
        $ID_value=$row["id_img"]; //получаем значение номера строки id_img и передаем его в getimage.php
        $url_image= "getimage.php?ID=$ID_value"; //картинка,генерируемая getimage.php
       
      $image="http://".$_SERVER['HTTP_HOST']."/backgrounds/".$url_image; // getimagesize нужен путь "http://..." вот гад :) Пришлось подставить урл хоста
      $prImage = getimagesize($image); //получение парметров картинки (хотя херово, двойной вызов скрипта getimage.php)
     
       echo "<table width=\"130\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
              <tr><td class=\"trumbnail\"><img src=\"".$url_image."\"></td></tr>
              <tr><td class=\"trumbnail_txt\">";
       printf ("ID=%d; название:<b>%s</b>; автор:%s; категория: <b>%s</b>; дата:%s %s",$row["id_img"],$row["name_img"],$row["author_img"],$row["category_img"],$row["data_img"],$prImage[3]);
       echo " </td></tr></table><br>";
       
    }while ($row = mysql_fetch_array($result));
 echo "</body></html>";
 }else
  {
    echo "Ошибка. Записей по данному запросу не найдено...";
  }

 mysql_free_result();


Вот...все это прекрасно работает. Но теперь мне приспичило ресайзить картинки на их выводе. В хависимости от параметра size
Код

switch ($size)
   {
    case '1': $max_height=80;  $max_width=101; break;
    case '2': $max_height=128; $max_width=128; break;
    case '3': $max_height=160; $max_width=120; break;
   }


И есть функция resize_img( $image_file_path, $new_image_file_path, $max_width=128, $max_height=128), котрая по идее должна это делать, но не все так просто sad.gif
Код

function resize_img( $image_file_path, $new_image_file_path, $max_width=128, $max_height=128)
{
   $image_quality=80;
   $return_val = 1;  //флаг
   
    //выуживаем файл, return_val=1 при удачи
   $return_val = ( ($img = ImageCreateFromJPEG ( $image_file_path )) && $return_val == 1 ) ? "1" : "0";
   
    //получаем размеры картинки
   $FullImage_width = imagesx ($img);    
   $FullImage_height = imagesy ($img);  
   
    //определяем пропорции и меняем если надо. Хотя может и не надо..
    //по ширине
   $ratio =  ( $FullImage_width > $max_width ) ? (real)($max_width / $FullImage_width) : 1;
   $new_width = ((int)($FullImage_width * $ratio));    
   $new_height = ((int)($FullImage_height * $ratio));    
           
 //по высоте            
   $ratio =  ( $new_height > $max_height ) ? (real)($max_height / $new_height) : 1;
   $new_width = ((int)($new_width * $ratio));  
   $new_height = ((int)($new_height * $ratio));    
   
    //Ресайзинг сам
    // а может и не нужно ресайз то?
   if ( $new_width == $FullImage_width && $new_height == $FullImage_height ) copy ( $image_file_path, $new_image_file_path );
   
    //крейтим имедж
   $full_id = ImageCreate( $new_width , $new_height );
   ImageCopyResized( $full_id, $img,
                   0,0,  0,0,
                   $new_width, $new_height,
                   $FullImage_width, $FullImage_height );
   $return_val = ( $full = ImageJPEG( $full_id, $new_image_file_path, $image_quality) && $return_val == 1 ) ? "1" : "0";
   ImageDestroy( $full_id );
           
   //возвращаем "1",если усё ок
   return ($return_val) ? TRUE : FALSE;
   
}


Для чегор, если я правильно понимаю, нужно использовать все-таки временный некий файл, котрый кретим:
Код
$temp = tempnam ("", "tmp");


И далее в show.php
подставляю:
Код
resize_img( $image, $temp , $max_width=128, $max_height=128)


Но ничерта... я понимаю что ImageCreateFromJPEG вроде должон уметь работать с урлами, но так как урд получаем вида http://domain/getimage.php?ID=1 Ничерта не пашет, мне кажется он хочет именно прямой линки на каринку. НУ а где я ее возьму?

Короче, вопрос smile.gif Как я могу посупить ? Что сдлеать стобы ресайзть картинку ,полученну в скртипте getimage.php?

Ребят, хоть направте, замучался уже sad.gif


PM MAIL   Вверх
wertyman
Дата 6.11.2003, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 28.10.2003

Репутация: нет
Всего: нет



может получать эту самую картинку из базы, затем сохранять ее в тээмпэшный файл, потом вызывать эту функцию, которая ресайзит с ссылкой на тмпэшный файл, а после, удалять его !? ;)
PM MAIL WWW ICQ   Вверх
constructor
Дата 8.11.2003, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.11.2003

Репутация: нет
Всего: нет



да, если кому интресно решилось все просто. Хотя, признаю, само решение не оригинально. Но в моем случае помогло.
Увжаемый, wertyman был прав. Другого выхода не видел smile.gif
Код

$image = tempnam ("", "tmp"); //темп файл с префиксом "tmp" в директории по-умолчанию (из базы)
 $newimage = tempnam ("", "dst"); //временный файл для изменеий картинок
 
 if (is_writable($image))
{
    if (!$handle = fopen($image, 'w'))
    {
         print "Не удается открыть файл<b>($image)</b>";
         exit;
    }
    if (!fwrite($handle, $data))
    {
        print "Не получилось записать в файл ($image)";
        exit;
    }
    //print "Все записано!  Данные ушли в ($image)";
    fclose($handle); //закрываем
    //@unlink($image) or die ("Не могу уничтожить временный файл <b>$image</b>"); //удаляем временный файл
} else print "Файл <b>$image</b> не возможно записать или не создался :)";


Хотя возможно лишнее создавать два временных, можно обойтись и одним
PM MAIL   Вверх
constructor
Дата 8.11.2003, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.11.2003

Репутация: нет
Всего: нет



ну потом...когда наиграюсь с файлами обязательно их прибиваю. А то хостер ,думаю, не обрадуется smile.gif
PM MAIL   Вверх
botinki
Дата 9.11.2003, 12:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Еще вопрос, как зааплодить картинку в БЛОБ
  Вверх
constructor
Дата 10.11.2003, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.11.2003

Репутация: нет
Всего: нет



поправка. в коде :
Код
$image = tempnam ("", "tmp"); //темп файл с префиксом "tmp" в директории по-умолчанию (из базы)
 $newimage = tempnam ("", "dst"); //временный файл для изменеий картинок
 
 if (is_writable($image))
{
    if (!$handle = fopen($image, 'wb'))
    {
         print "Не удается открыть файл<b>($image)</b>";
         exit;
    }

лучьше заменить параметр fopen ($image, 'w') на fopen ($image, 'wb'). Что свзянанно со спецификой предсватленния двоичных данных smile.gif под Windows. В униксах можно и забить.

2botinki:
(Для тех, кто в обуви smile.gif))
В принципе это все описано на самом сайте в статьях, но можно и копи пастом:

Код

<html><head>
<link href="common/base.css" rel="stylesheet" type="text/css">
</head><body>
<FORM ENCTYPE="multipart/form-data" ACTION="<?php $PHP_SELF ?>" METHOD=POST>
<p>Выберите Ваш файл <b>background</b></p>

<table width="75%" border="0" cellspacing="0" cellpadding="0">
 <tr><td width=30% class="textform">файл (jpeg, gif):</td><td><input name="userfile" type="file" class="textedit" size="20" maxlength="100"></td></tr>
 <tr><td width=30% class="textform">название</td><td><input type="text" name="usr_file_name" size="34" maxlength="34" class="textedit"></td></tr>
 <tr><td width=30% class="textform">автор<font style='color:red'>*</font></td><td><input type="text" name="usr_author" size="34" maxlength="34" class="textedit"></td></tr>
</table>
 <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="30000">
 <INPUT TYPE="submit" VALUE="Отправить файл" name="submit" class="textedit">
</FORM>

<?php
//===========================================================================
function mydb_connect ()
{
  $link=mysql_connect ("localhost", "root", "") or die("Could not connect to mysql");
  if ($link && mysql_select_db ("backgrounds"))  
    return($link);  
    return(FALSE);  
}
//===========================================================================
if ($userfile)
 {
  if ($userfile_type=="image/gif" OR $userfile_type=="image/jpeg" OR $userfile_type=="image/pjpeg")
  {
   if ($userfile_size <30000 )
   {
       echo "
       Вы загрузили файл размером:
       <font color=red><b>$userfile_size</b></font> байт<br><br>
 
       На вашем компьютере файл назывался:
       <font color=red><b>$userfile_name</b></font><br><br>
       
       Тип файла:
       <font color=red><b>$userfile_type</b></font><br><br>
 
       На нашем сервере ваш файл был записан для временного храниения
       по адресу и под именем
       <font color=red><b>$userfile</b></font><br><br>      
      ";
   }else
       {
        echo "<br><font color=red><b>Файл не принят, так как его размер превышает допустимые 30Кб</b></font><br>";
        exit;
       }
  }else
       {
        echo"<br>Выбран файл типа <font color=red><b>".$userfile_type."</b></font>,что не соответсвует предложенному формату (<b>gif, jpeg</b>).<br>";
        exit;
       }
 }else
     {
      echo "Вы не выбрали файл...Попробуйте еще раз.";
      exit;
     }
     
//режем плохие запросы :)
$upload = str_replace("'", "", $upload);
$usr_file_name = str_replace("'", "", $usr_file_name);
$usr_author = str_replace("'", "", $usr_author);

//суем файло в мускулную базу
 $f=fopen($userfile,"rb"); // имя картинки -- открыли файл на чтение
  $upload=fread($f,filesize($userfile)); // считали файл в переменную
 fclose($f);

 //режем нахер глупые символы ' " \
 $upload=addslashes($upload);
 
 //коннектимся к базе
  if (!mydb_connect()) print("Error connection to database");;    
 //вставляем в backgrounds в таблицу images_tb
 //все поля
 $result = mysql_query("INSERT INTO images_tb(path_img,name_img,author_img,category_img,data_img,user_ip_img) VALUES ('$upload','$usr_file_name','$usr_author','$usr_category',NOW(),'$REMOTE_ADDR')");

 $query = "INSERT INTO images_tb(name_img,author_img,category_img,data_img,user_ip_img) VALUES ('$usr_file_name','$usr_author','$usr_category',NOW(),'$REMOTE_ADDR')";
 echo($query);
 //mysql_query($query);

?>


Ну ,код не идеален.... к примеру, нужно бы регулярными выражениями боле тщательнее оьрабатывать щзапросы к базе, а не тольок резать [ ' ]
А так рабочий пример. Хотя можно вынести часть до функций в отдельный файл html и вызывать не $PHP_SELF ,а именно файл с отсальнывм содержимым. (какойнить upload.php)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.